SuperBrother在機房裏閒着沒事幹(再對比一下他的NOIP,真是諷刺啊......),因而便無聊地開始玩「打鼴鼠」......測試
在這個「打鼴鼠」的遊戲中,鼴鼠會不時地從洞中鑽出來,不過不會從洞口鑽進去(鼴鼠真膽大……)。洞口都在一個大小爲n(n<=1024)的正方形中。這個正方形在一個平面直角座標系中,左下角爲(0,0),右上角爲(n-1,n-1)。洞口所在的位置都是整點,就是橫縱座標都爲整數的點。而SuperBrother也不時地會想知道某一個範圍的鼴鼠總數。這就是你的任務。spa
每一個輸入文件有多行。code
第一行,一個數n,表示鼴鼠的範圍。blog
之後每一行開頭都有一個數m,表示不一樣的操做:
m=1,那麼後面跟着3個數x,y,k(0<=x,y<n),表示在點(x,y)處新出現了k只鼴鼠;
m=2,那麼後面跟着4個數x1,y1,x2,y2(0<=x1<=x2<n,0<=y1<=y2<n),表示詢問矩形(x1,y1)-(x2,y2)內的鼴鼠數量;
m=3,表示老師來了,不能玩了。保證這個數會在輸入的最後一行。遊戲
詢問數不會超過10000,鼴鼠數不會超過maxlongint。io
對於每一個m=2,輸出一行數,這行數只有一個數,即所詢問的區域內鼴鼠的個數。class
4 1 2 2 5 2 0 0 2 3 3
5
各個測試點1s數據
水題一道。di
全部數據均爲隨機生成,包括樣例……文件
gnaggnoyil
線段樹套線段樹維護二維區間和便可;
1 #include<cstdio> 2 #define LL long long 3 const int maxm=4e3+120; 4 inline LL min_(LL x,LL y){return x<y?x:y;} 5 inline LL max_(LL x,LL y){return x>y?x:y;} 6 int n,m; 7 LL t[maxm][maxm]; 8 void y_add(int k,int l,int r,int x,int y,int p){ 9 if(l==r){ 10 t[y][k]+=p; 11 return; 12 } 13 int mid=l+r>>1,ls=k<<1,rs=ls|1; 14 if(x<=mid) y_add(ls,l,mid,x,y,p); 15 else y_add(rs,mid+1,r,x,y,p); 16 t[y][k]=t[y][ls]+t[y][rs]; 17 } 18 void x_add(int k,int l,int r,int x,int y,int p){ 19 if(l==r){ 20 y_add(1,0,n,y,k,p); 21 return; 22 } 23 int mid=l+r>>1,ls=k<<1,rs=ls|1; 24 if(x<=mid) x_add(ls,l,mid,x,y,p); 25 else x_add(rs,mid+1,r,x,y,p); 26 y_add(1,0,n,y,k,p); 27 } 28 LL y_tot(int k,int l,int r,int al,int ar,int p){ 29 if(l==al&&r==ar) return t[p][k]; 30 LL ret=0; 31 int mid=l+r>>1,ls=k<<1,rs=ls|1; 32 if(al<=mid) ret+=y_tot(ls,l,mid,al,min_(ar,mid),p); 33 if(ar>mid) ret+=y_tot(rs,mid+1,r,max_(al,mid+1),ar,p); 34 return ret; 35 } 36 LL x_tot(int k,int l,int r,int al,int ar,int x,int y){ 37 if(l==al&&r==ar) return y_tot(1,0,n,x,y,k); 38 LL ret=0; 39 int mid=l+r>>1,ls=k<<1,rs=ls|1; 40 if(al<=mid) ret+=x_tot(ls,l,mid,al,min_(ar,mid),x,y); 41 if(ar>mid) ret+=x_tot(rs,mid+1,r,max_(al,mid+1),ar,x,y); 42 return ret; 43 } 44 int main(){ 45 scanf("%d",&n); 46 int x1,x2,y1,y2,x,y,k; 47 while(scanf("%d",&m),m!=3){ 48 if(m==1){ 49 scanf("%d%d%d",&x,&y,&k); 50 x_add(1,0,n,x,y,k); 51 } 52 else{ 53 scanf("%d%d%d%d",&x1,&y1,&x2,&y2); 54 printf("%lld\n",x_tot(1,0,n,x1,x2,y1,y2)); 55 } 56 } 57 return 0; 58 }
這隨手寫出來的一坨,好像是我生平第一棵樹套樹QUQ
肚子有點餓,手開始冷了的說。。。