首页 > 代码库 > hdu 1698 Just a Hook 基本线段树
hdu 1698 Just a Hook 基本线段树
使用线段树更新每段区间的奖(1,2,3),最后在统计整段区间的数和,基本线段树,果断1A啊
#include<iostream> #include<stdio.h> using namespace std; #define N 100000 struct node{ int l,r,p; }a[N*4]; int n; void build(int left,int right,int i){ a[i].l=left; a[i].r=right; a[i].p=1; if(a[i].l==a[i].r){ return ; } int mid=(a[i].l+a[i].r)>>1; build(left,mid,i*2); build(mid+1,right,i*2+1); // a[i].p=a[i*2].p+a[i*2+1].p; } void updata(int left,int right,int i,int p){ if(left==a[i].l&&a[i].r==right){ a[i].p=p; return ; } if(a[i].p>=1){ a[i*2].p=a[i].p; a[i*2+1].p=a[i].p; a[i].p=-1; } int mid=(a[i].l+a[i].r)>>1; if(mid>=right) updata(left,right,i*2,p); else if(mid<left) updata(left,right,i*2+1,p); else{ updata(left,mid,i*2,p); updata(mid+1,right,i*2+1,p); } // a[i].p=a[i*2].p+a[i*2+1].p; } int ans=0; void sum(int i){ // cout<<a[i].l<<" "<<a[i].r<<" "<<a[i].p<<endl; if(a[i].p!=-1){ ans+=a[i].p*(a[i].r-a[i].l+1); return ; } sum(i*2); sum(i*2+1); } int main(){ int t,s,x,y,z; scanf("%d",&t); int cou=1; while(t--){ scanf("%d %d",&n,&s); build(1,n,1); while(s--){ scanf("%d%d%d",&x,&y,&z); updata(x,y,1,z); } ans=0; sum(1); printf("Case %d: The total value of the hook is %d.\n",cou++,ans); } }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。