[Vijos] SuperBrother打鼴鼠

背景

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

樣例1

樣例輸入1

4
1 2 2 5
2 0 0 2 3
3

樣例輸出1

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

肚子有點餓,手開始冷了的說。。。

相關文章
相關標籤/搜索