HDU 1166 敌兵布阵(第一个树状数组)
2012-07-17 10:20
232 查看
题目链接
以前用普通方法150+ms 今天看了书上有这个题的详细树状数组的代码,理解下,敲敲交上居然300ms+,我正纳闷的时候,交上以前的代码TLE了。。
以前用普通方法150+ms 今天看了书上有这个题的详细树状数组的代码,理解下,敲敲交上居然300ms+,我正纳闷的时候,交上以前的代码TLE了。。
#include <stdio.h> #include <string.h> #define N 50005 int p ,n;//p[i] 就代表从i - i&(-i)+1到i的和 int lowbit(int t)//寻找低位起第一个非0位 { return (-t)&t;//如4二进制是100所以就是4,如7二进制为111,是1 } void insert(int t,int d)//更新某个点 { while(t <= n) { p[t] += d; t += lowbit(t);//要将含有此元素的和都更新 } } int getsum(int t)//求和 { int sum = 0; while(t > 0) { sum += p[t]; t -= lowbit(t); } return sum; } int main() { int t,i,num = 0,x,y,k; char str[100]; scanf("%d",&t); while(t--) { num ++; memset(p,0,sizeof(p)); scanf("%d",&n); for(i = 1;i <= n;i ++) { scanf("%d%*c",&k); insert(i,k); } scanf("%s",str); printf("Case %d:\n",num); while(strcmp(str,"End") != 0) { scanf("%d%d%*c",&x,&y); if(strcmp(str,"Query") == 0) printf("%d\n",getsum(y)-getsum(x-1)); else if(strcmp(str,"Add") == 0) insert(x,y); else if(strcmp(str,"Sub") == 0) insert(x,(-1)*y); scanf("%s",str); } } return 0; }
相关文章推荐
- hdu-1166 敌兵布阵 树状数组
- hdu 1166 敌兵布阵(线段树 or 树状数组)
- HDU 1166 敌兵布阵 树状数组
- hdu 1166 敌兵布阵 线段树和树状数组
- hdu-1166 敌兵布阵 (线段树或树状数组)
- HDU - 1166 敌兵布阵 树状数组做法
- HDU1166敌兵布阵(线段树,树状数组)
- hdu 1166 敌兵布阵 树状数组
- hdu 1166 敌兵布阵(线段树,树状数组)
- HDU 1166 敌兵布阵 树状数组
- hdu 1166 敌兵布阵 (线段树、树状数组模板,单点更新)
- HDU-1166 敌兵布阵 线段树|树状数组
- HDU 1166 敌兵布阵(第一个线段树)
- HDU-1166 敌兵布阵 树状数组
- HDU 1166 敌兵布阵 树状数组
- HDU 1166 敌兵布阵 树状数组模板
- HDU 1166 敌兵布阵【树状数组入门题】
- hdu(1166):敌兵布阵—树状数组的应用
- HDU 1166 敌兵布阵 树状数组
- hdu 1166 敌兵布阵 树状数组