樹狀陣列模板題—hdu1166+poj2352
阿新 • • 發佈:2019-01-01
hdu1166 敵兵佈陣
樹狀陣列的第一道題,實質就是copy學長的程式碼,鄙視一下自己
#include<cstdio> #include<cstring> using namespace std; const int num=50005; int n,bit[num]; int lowbit(int a) { return a&(-a); } void init() { int i; for(i=1;i<=n;i++) bit[i]=0; } void updata(int x,int add) { while(x<=n) { bit[x]+=add; x+=lowbit(x); } } int sum(int a) { int ans=0; while(a>0) { ans+=bit[a]; a-=lowbit(a); } return ans; } int main() { int t,i,k,a,b; char s[10]; //freopen("in.txt","r",stdin); scanf("%d",&t); for(k=1;k<=t;k++) { scanf("%d",&n); init(); for(i=1;i<=n;i++) { scanf("%d",&a); updata(i,a); } printf("Case %d:\n",k); while(scanf("%s",s)) { if(strcmp(s,"End")==0) break; else if(strcmp(s,"Add")==0) { scanf("%d%d",&a,&b); updata(a,b); } else if(strcmp(s,"Sub")==0) { scanf("%d%d",&a,&b); updata(a,-b); } else if(strcmp(s,"Query")==0) { scanf("%d%d",&a,&b); printf("%d\n",sum(b)-sum(a-1)); } } } return 0; }
思路:因為資料輸入是按照y座標遞增,y座標相同時,按照x座標遞增輸入,用樹狀陣列對x座標進行統計。
注意:座標是從0開始的,而樹狀陣列是從1開始的,用樹狀陣列的a的值表示當前在直線x=a-1上的的星星個數。
#include<cstdio> #include<cstring> using namespace std; const int num=32005; int n,cnt[num],level[15005]; int lowbit(int x) { return x&(-x); } void updata(int a,int add) { while(a<num) { cnt[a]+=add; a+=lowbit(a); } } int sum(int a) { int ans=0; while(a>0) { ans+=cnt[a]; a-=lowbit(a); } return ans; } int main() { int i,j,x,y,t; //freopen("in.txt","r",stdin); scanf("%d",&n); memset(cnt,0,sizeof(cnt)); memset(level,0,sizeof(level)); for(i=0;i<n;i++) { scanf("%d%d",&x,&y); updata(x+1,1); t=sum(x+1); level[t-1]++; } for(i=0;i<n;i++) printf("%d\n",level[i]); return 0; }