简单单点更新线段树
简单线段树
hdu1166
1 #include<stdio.h> 2 #define lson l,m,rt<<1 3 #define rson m+1,r,rt<<1|1 4 #define maxn 50505 5 int sum[maxn<<2]; 6 void PushUP(int rt) 7 { 8 sum[rt] = sum[rt<<1] + sum[rt<<1|1]; 9 } 10 void build(int l,int r,int rt) 11 { 12 if(l == r) 13 { 14 scanf("%d",&sum[rt]); 15 return; 16 } 17 int m = (l + r)/2; 18 build(lson); 19 build(rson); 20 PushUP(rt); 21 } 22 void Updata(int p,int add,int l,int r,int rt) 23 { 24 if(l == r) 25 { 26 sum[rt] += add; 27 return ; 28 } 29 int m = (l + r)/2; 30 if(p <= m) 31 Updata(p,add,lson); 32 else 33 Updata(p,add,rson); 34 PushUP(rt); 35 } 36 int Query(int L,int R,int l,int r,int rt) 37 { 38 if(L <= l&&r <= R) 39 return sum[rt]; 40 int ret = 0; 41 int m = (l + r)/2; 42 if(L > m) 43 ret += Query(L,R,rson); 44 else if(m >= R) 45 ret += Query(L,R,lson); 46 else 47 { 48 ret += Query(L,R,lson); 49 ret += Query(L,R,rson); 50 } 51 return ret; 52 } 53 int main() 54 { 55 int T , ff = 0 , n; 56 scanf("%d",&T); 57 while(T--) 58 { 59 printf("Case %d:\n",++ff); 60 scanf("%d",&n); 61 build(1,n,1); 62 char s[10]; 63 while(scanf("%s",s)!=EOF) 64 { 65 if(s[0]=='E') 66 break; 67 int a,b; 68 scanf("%d%d",&a,&b); 69 if(s[0]=='A') 70 Updata(a,b,1,n,1); 71 else if(s[0]=='S') 72 Updata(a,-b,1,n,1); 73 else if(s[0]=='Q') 74 printf("%d\n",Query(a,b,1,n,1)); 75 } 76 } 77 }
hdu1394
1 #include<stdio.h> 2 #define lson l,m,rt<<1 3 #define rson m+1,r,rt<<1|1 4 #define maxn 5500 5 int sum[maxn<<2]; 6 int a[maxn]; 7 void PushUp(int rt) 8 { 9 sum[rt]=sum[rt<<1]+sum[rt<<1|1]; 10 } 11 void build(int l,int r,int rt) 12 { 13 sum[rt]=0; 14 if(l==r) 15 return; 16 int m=(l+r)/2; 17 build(lson); 18 build(rson); 19 } 20 int Query(int L,int R,int l,int r,int rt) 21 { 22 if(L<=l&&R>=r) 23 return sum[rt]; 24 int m=(l+r)/2; 25 int ret=0; 26 if(m >= L) 27 ret+=Query(L,R,lson); 28 if(m < R) 29 ret+=Query(L,R,rson); 30 return ret; 31 } 32 void Updata(int p,int l,int r,int rt) 33 { 34 if(l==r) 35 { 36 sum[rt]++; 37 return; 38 } 39 int m=(r+l)/2; 40 if(m>=p) 41 Updata(p,lson); 42 else 43 Updata(p,rson); 44 PushUp(rt); 45 } 46 int main() 47 { 48 int i,n; 49 while(scanf("%d",&n)!=EOF) 50 { 51 build(1,n,1); 52 int ss=0; 53 for(i=0;i<n;i++) 54 { 55 scanf("%d",&a[i]); 56 ss+=Query(a[i],n-1,0,n-1,1); 57 Updata(a[i],0,n-1,1); 58 } 59 int ans=ss; 60 for(i=0;i<n;i++) 61 { 62 ans=ans+n-1-2*a[i]; 63 if(ans<ss) 64 ss=ans; 65 } 66 printf("%d\n",ss); 67 } 68 }
hdu2795
1 #include<stdio.h> 2 #define lson l,m,rt<<1 3 #define rson m+1,r,rt<<1|1 4 #define maxn 202002 5 int sum[maxn<<2]; 6 int max(int x,int y) 7 { 8 return x>y?x:y; 9 } 10 void PushUp(int rt) 11 { 12 sum[rt]=max(sum[rt<<1],sum[rt<<1|1]); 13 } 14 void build(int l,int r,int rt,int v) 15 { 16 sum[rt]=v; 17 if(l==r) 18 { 19 return; 20 } 21 int m=(l+r)/2; 22 build(lson,v); 23 build(rson,v); 24 // PushUp(rt); 25 } 26 int Query(int len,int l,int r,int rt) 27 { 28 if(len>sum[rt]) 29 return -1; 30 if(l==r) 31 { 32 sum[rt]-=len; 33 return l; 34 } 35 int ret; 36 int m=(l+r)/2; 37 if(len<=sum[rt<<1]) 38 ret = Query(len,lson); 39 else if(len<=sum[rt<<1|1]) 40 ret = Query(len,rson); 41 PushUp(rt); 42 return ret; 43 } 44 int main() 45 { 46 int h,w,n,i; 47 while(scanf("%d%d%d",&h,&w,&n)!=EOF) 48 { 49 if(h>n) 50 h=n; 51 build(1,h,1,w); 52 int x; 53 for(i=0;i<n;i++) 54 { 55 scanf("%d",&x); 56 if(x>sum[1]) 57 printf("-1\n"); 58 else 59 { 60 printf("%d\n",Query(x,1,h,1)); 61 } 62 } 63 } 64 }
poj2828
1 #include<stdio.h> 2 #define lson l,m,rt<<1 3 #define rson m+1,r,rt<<1|1 4 #define maxn 200200 5 int sum[maxn<<2]; 6 struct node 7 { 8 int id; 9 int v; 10 }a[maxn]; 11 int place,map[maxn]; 12 void PushUp(int rt) 13 { 14 sum[rt]=sum[rt<<1]+sum[rt<<1|1]; 15 } 16 void build(int l,int r,int rt) 17 { 18 if(l==r) 19 { 20 sum[rt]=1; 21 return ; 22 } 23 int m=(l+r)/2; 24 build(lson); 25 build(rson); 26 PushUp(rt); 27 } 28 void Updata(int p,int l,int r,int rt) 29 { 30 if(l==r) 31 { 32 place=l; 33 sum[rt]--; 34 return; 35 } 36 int m=(l+r)/2; 37 if(sum[rt<<1]>=p) 38 Updata(p,lson); 39 else 40 { 41 p=p-sum[rt<<1]; 42 Updata(p,rson); 43 } 44 PushUp(rt); 45 } 46 int main() 47 { 48 int i,n; 49 while(scanf("%d",&n)!=EOF) 50 { 51 build(1,n,1); 52 for(i=0;i<n;i++) 53 { 54 scanf("%d%d",&a[i].v,&a[i].id); 55 } 56 for(i=n-1;i>=0;i--) 57 { 58 Updata(a[i].v+1,1,n,1); 59 map[place]=a[i].id; 60 } 61 for(i=1;i<=n;i++) 62 { 63 if(i==1) 64 printf("%d",map[i]); 65 else printf(" %d",map[i]); 66 } 67 printf("\n"); 68 } 69 }
hdu1698成段更新
1 #include<stdio.h> 2 #define lson l,m,rt<<1 3 #define rson m+1,r,rt<<1|1 4 #define maxn 101000 5 int sum[maxn<<2],mark[maxn<<2]; 6 void pushup(int rt) 7 { 8 sum[rt]=sum[rt<<1]+sum[rt<<1|1]; 9 } 10 void build(int l,int r,int rt) 11 { 12 mark[rt]=0; 13 if(l==r) 14 { 15 sum[rt]=1; 16 return; 17 } 18 int m=(l+r)/2; 19 build(lson); 20 build(rson); 21 pushup(rt); 22 } 23 void pushdown(int rt,int len) 24 { 25 if(mark[rt]) 26 { 27 mark[rt<<1|1]=mark[rt<<1]=mark[rt]; 28 sum[rt<<1]=mark[rt]*(len-len/2); 29 sum[rt<<1|1]=mark[rt]*(len/2); 30 mark[rt]=0; 31 } 32 } 33 void updata(int L,int R,int c,int l,int r,int rt) 34 { 35 if(l>=L&&R>=r) 36 { 37 mark[rt]=c; 38 sum[rt]=c*(r-l+1); 39 return; 40 } 41 pushdown(rt,r-l+1); 42 int m=(l+r)/2; 43 if(m>=L) 44 updata(L,R,c,lson); 45 if(R>m) 46 updata(L,R,c,rson); 47 pushup(rt); 48 } 49 int main() 50 { 51 int n,m,t,ff=0; 52 scanf("%d",&t); 53 while(t--) 54 { 55 scanf("%d",&n); 56 build(1,n,1); 57 scanf("%d",&m); 58 while(m--) 59 { 60 int x,y,z; 61 scanf("%d%d%d",&x,&y,&z); 62 updata(x,y,z,1,n,1); 63 } 64 printf("Case %d: The total value of the hook is %d.\n",++ff,sum[1]); 65 } 66 }