HDU1166 敌兵布阵 非递归线段树 & 递归线段树 & 树状数组
2014-07-05 19:33
274 查看
参考文献:点击打开链接
好吧,已跪。最后膜拜一下看不见背影的大牛们。
非递归版线段树:
int c[200010],M; void add(int k, int v) { for (c[k+=M]+=v, k>>=1 ; k; k>>=1) if (k<M) c[k]=c[k << 1] + c[k << 1 | 1]; return ; } int query(int s, int t) { int Ans=0; for (s=s+M-1,t=t+M+1; s^t^1; s>>=1,t>>=1) { if (!(s & 1)) Ans+=c[s^1]; if (t & 1) Ans+=c[t^1]; } return Ans; } int main() { //freopen("input.txt","r",stdin); int T; scanf("%d",&T); for (int k=1; k<=T; k++) { int n; scanf("%d",&n); M=1 << (int)(log((double)n)/log(2.0)+1); for (int i=0; i!=n; i++) scanf("%d",&c[i+M]); for (int i=M-1; i>=1; i--) c[i]=c[i << 1]+c[i << 1 | 1]; char q[10]; int x,y; printf("Case %d:\n",k); while (scanf("%s",q) && strcmp(q,"End")) { scanf("%d%d",&x,&y); if (q[0]=='A') add(x-1,y); else if (q[0]=='S') add(x-1,-y); else printf("%d\n",query(x-1,y-1)); } } }
递归版线段树:
#define lson l , m , rt << 1 #define rson m + 1 , r , rt << 1 | 1 const int maxn = 55555; int sum[maxn<<2]; void PushUP(int rt) { sum[rt] = sum[rt<<1] + sum[rt<<1|1]; } void build(int l,int r,int rt) { if (l == r) { scanf("%d",&sum[rt]); return ; } int m = (l + r) >> 1; build(lson); build(rson); PushUP(rt); } void update(int p,int add,int l,int r,int rt) { if (l == r) { sum[rt] += add; return ; } int m = (l + r) >> 1; if (p <= m) update(p , add , lson); else update(p , add , rson); PushUP(rt); } int query(int L,int R,int l,int r,int rt) { if (L <= l && r <= R) { return sum[rt]; } int m = (l + r) >> 1; int ret = 0; if (L <= m) ret += query(L , R , lson); if (R > m) ret += query(L , R , rson); return ret; } int main() { //freopen("input.txt","r",stdin); int T , n; scanf("%d",&T); for (int cas = 1 ; cas <= T ; cas ++) { printf("Case %d:\n",cas); scanf("%d",&n); build(1 , n , 1); char op[10]; while (scanf("%s",op)) { if (op[0] == 'E') break; int a , b; scanf("%d%d",&a,&b); if (op[0] == 'Q') printf("%d\n",query(a , b , 1 , n , 1)); else if (op[0] == 'S') update(a , -b , 1 , n , 1); else update(a , b , 1 , n , 1); } } return 0; }
树状数组版:
int a[50005],c[50005],n; int lowbit(int x) { return x & -x ; } int sum(int k) { int ret=0; while (k) { ret+=c[k]; k-=lowbit(k); } return ret; } void add(int k, int x) { while (k<=n) { c[k]+=x; k+=lowbit(k); } } int main() { //freopen("input.txt","r",stdin); int T; scanf("%d",&T); for (int k=1; k<=T; k++) { scanf("%d",&n); for (int i=1; i<=n; i++) scanf("%d",&a[i]); memset(c,0,sizeof(c)); for (int i=1; i<=n; i++) add(i,a[i]); char q[10]; int x,y; printf("Case %d:\n",k); while (scanf("%s",q) && strcmp(q,"End")) { scanf("%d%d",&x,&y); if (q[0]=='A') add(x,y); else if (q[0]=='S') add(x,-y); else printf("%d\n",sum(y)-sum(x-1)); } } return 0; }
好吧,已跪。最后膜拜一下看不见背影的大牛们。
相关文章推荐
- hdu1754 I Hate It && hdu1166 敌兵布阵 ——线段树复习
- HDU 1166 敌兵布阵 (线段树 & 树状数组)
- hdu1166 敌兵布阵(线段树 || 树状数组)
- HDU 1166 敌兵布阵 (线段树 & 树状数组)
- hdu1166 敌兵布阵(树状数组 && 线段树单点更新)
- HDU1166 敌兵布阵 线段树区间求和||树状数组
- HDU 1166 敌兵布阵(区间求和&(线段树|树状数组))
- hdu1166 敌兵布阵 (线段树模板)
- HDU 1166 敌兵布阵(线段树,树状数组)
- hdu 1166 敌兵布阵(线段树,树状数组)
- HDU1166 敌兵布阵 解题报告--线段树
- hdu1166 敌兵布阵 线段树
- [ACM_数据结构] HDU 1166 敌兵布阵 线段树 或 树状数组
- HDU1166:敌兵布阵(线段树单点更新)
- hdu 1166 敌兵布阵(线段树,树状数组)
- hdu1166~敌兵布阵~树状数组求和
- hdu1166 敌兵布阵+线段树模板题+单点修改
- [hdu]1166敌兵布阵-线段树&树状数组
- hdu1166 敌兵布阵 线段树
- hdu1166 敌兵布阵 线段树,单点更新