二维的单点修改+区间求和。
现在又拿出来写一遍只是因为以前学过现在不会写了,即使知道省选考二维肯定不会考这么简单的,而复杂的二维问题我没有学过,但是还是要复习一下不枉曾经的学习。
// q.c #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #define mem(a) memset(a,0,sizeof(a)) using namespace std; const int M=1024+10; /*******************************************************************************/ int n,sum[M][M]; int lowbit(int x) { return x&-x; } void add(int x,int y,int k) { for(int i=x;i<=n;i+=lowbit(i)) for(int j=y;j<=n;j+=lowbit(j)) sum[i][j]+=k; } int que(int x,int y) { int ans=0; for(int i=x;i;i-=lowbit(i)) for(int j=y;j;j-=lowbit(j)) ans+=sum[i][j]; return ans; } int solve(int a,int b,int c,int d) { return que(c,d)-que(a-1,d)-que(c,b-1)+que(a-1,b-1); } /*******************************************************************************/ int main() { freopen("mobilephones.in","r",stdin); freopen("mobilephones.out","w",stdout); int opt,a,b,c,d; while(scanf("%d",&opt)==1) { if(opt==3) break; else if(opt==0) scanf("%d",&n),mem(sum); else if(opt==1) scanf("%d%d%d",&a,&b,&c),add(a+1,b+1,c); else scanf("%d%d%d%d",&a,&b,&c,&d),printf("%d\n",solve(a+1,b+1,c+1,d+1)); } return 0; }