hdu 1166 敌兵布阵 朴素线段树
2012-08-14 15:36
316 查看
#include<stdio.h> #include<string.h> #define MAX 1000001 int a[MAX],ci; int find(int left,int right,int i,int j,int num) { int mid=(left+right)/2; if(left==i&&right==j) return a[num]; else if(i==j) return a[i]; else if(i<=mid&&j>mid) return find(mid+1,right,mid+1,j,2*num+1)+find(left,mid,i,mid,2*num); else if(j<=mid) return find(left,mid,i,j,num*2); else if(i>mid) return find(mid+1,right,i,j,num*2+1); } int main() { int T; scanf("%d",&T); for(int cas=1;cas<=T;cas++) { printf("Case %d:\n",cas); memset(a,0,sizeof(a)); int n;ci=1; scanf("%d",&n); while(ci<=n) ci*=2; for(int i=ci;i<ci+n;i++) scanf("%d",&a[i]); for(int i=ci-1;i>0;i--) a[i]=a[2*i]+a[2*i+1]; char s[10]; while(scanf("%s",s)&&s[0]!='E') { // for(int c=1;c<ci+n;c++) // printf("%d ",a[c]); // printf("\n"); int i,j; scanf("%d%d",&i,&j); if(s[0]=='A') for(int k=ci+i-1;k>0;k/=2) a[k]+=j; else if(s[0]=='S') for(int k=ci+i-1;k>0;k/=2) a[k]-=j; else { int left=ci,right=ci*2-1;i=i+ci-1;j=ci+j-1; if(i==j) printf("%d\n",a[i]); else printf("%d\n",find(left,right,i,j,1)); } } } return 0; }
相关文章推荐
- HDU 1166 敌兵布阵(线段树:点更新,区间求和)
- hdu 1166 敌兵布阵 线段树 点修改_求和
- HDU 1166 敌兵布阵(线段树区间和)
- 线段树 端点更新 hdu-1166-敌兵布阵
- HDU 1166:敌兵布阵(线段树入门)
- 敌兵布阵 HDU - 1166 (线段树单点更新)
- HDU 1166 敌兵布阵(线段树基础)
- [ACM] hdu 1166 敌兵布阵 (线段树,单点更新)
- HDU—1166—敌兵布阵—【数据结构】【线段树】【单点更新】
- hdu 1166 敌兵布阵(线段树单点更新)
- kuangbin专题七:A题 HDU 1166 敌兵布阵(单点更新,区域查询求和的线段树模板)
- HDU 1166 敌兵布阵 线段树
- HDU 1166 敌兵布阵 线段树
- HDU 1166 敌兵布阵 (线段树单点更新 区间查询)
- HDU 1166 敌兵布阵(线段树单点更新)
- HDU 1166敌兵布阵(线段树)
- HDU 1166 敌兵布阵 //线段树单点更新
- HDU 1166 敌兵布阵 线段树入门
- HDU 1166 敌兵布阵(线段树点更新区间求和裸题)
- HDU 1166 敌兵布阵(线段树单点更新+区间求和)