打鼴鼠
阿新 • • 發佈:2018-11-24
在這個“打鼴鼠”的遊戲中,鼴鼠會不時地從洞中鑽出來,不過不會從洞口鑽進去(鼴鼠真膽大……)。洞口都在一個大小為n(n≤1024)的正方形中。這個正方形在一個平面直角座標系中,左下角為(0,0),右上角為(n-1,n-1)。洞口所在的位置都是正點,即橫座標、縱座標都為整數的點。而SuperBrother也不時地會想知道某一個範圍的鼴鼠總數。這就是你的任務。
二維樹狀陣列的模板,然而並不會寫,於是現場腦補
紅色的地方是我們要求的,藍色的部分是重複的,要減去,然後淺藍色的部分是重複減去的,要再加回來
下面給出程式碼:
#include<iostream> #include<algorithm> #include<cstring> #include<string> #include<cmath> #include<cstdio> #include<cstdlib> using namespace std; inline int rd(){ int x=0,f=1; char ch=getchar(); for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1; for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0'; return x*f; } inline void write(int x){ if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10+'0'); return ; } int c[1026][1026]; int n,m; inline int lowbit(int x){return x&(-x);} inline void change(int i,int j,int k){ for(;i<=n;i+=lowbit(i))for(int y=j;y<=n;y+=lowbit(y)) c[i][y]+=k; } inline int solve(int i,int j){ int ans=0; for(;i>0;i-=lowbit(i)){ for(int y=j;y>0;y-=lowbit(y)){ ans+=c[i][y]; } } return ans; } int main(){ n=rd(); while(scanf("%d",&m)){ if(m==1){ int x=rd(),y=rd(); x++,y++; int k=rd(); change(x,y,k); } if(m==2){ int a1=rd(),b1=rd(),a2=rd(),b2=rd(); a1++,b1++,a2++,b2++; write(solve(a2,b2)-solve(a2,b1-1)-solve(a1-1,b2)+solve(a1-1,b1-1));puts(""); } if(m==3) break; } return 0; }