上帝造题的七分钟(树桩数组乱搞)

类比一维的树桩数组,进行二维的操作

需要差分数组,从别的博客应该可以找的比较好的图的啦

题面

#include<bits/stdc++.h>
#define lowbit(x) x&(-x)
using namespace std;
int n,m,num,x,y,xx,yy;
char c[3];
const int N=2050;
struct node
{
    int tree[N][N];
    int query(int x,int y)
    {
        int res=0;
        for (int i=x;i>=1;i-=lowbit(i))
         for (int j=y;j>=1;j-=lowbit(j))
         res+=tree[i][j];
        return res; 
    }
    void add(int x,int y,int num)
    {
        for (int i=x;i<=n;i+=lowbit(i))
         for (int j=y;j<=n;j+=lowbit(j))
         tree[i][j]+=num;
    }
} A,Ai,Aj,Aij;
void add(int x,int y,int num)
{
    A.add(x,y,num);
    Ai.add(x,y,num*x);
    Aj.add(x,y,num*y);
    Aij.add(x,y,num*x*y);
}
int ans(int x,int y)
{
    return A.query(x,y)*(x*y+x+y+1)-
           Ai.query(x,y)*(y+1)-
           Aj.query(x,y)*(x+1)+
           Aij.query(x,y);
}
int read()
{
    int x=0,f=1;char ch=getchar();
    while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}
    while (ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
int main()
{
    scanf("X ");
    n=read();m=read();
    while (~scanf("%s",&c))
    {
        x=read();y=read();xx=read();yy=read();
        if (c[0]=='L')
        {
            num=read();
            add(x,y,num);
            add(x,yy+1,-num);
            add(xx+1,y,-num);
            add(xx+1,yy+1,num);
        }
        else {
            printf("%d\n",ans(xx,yy)-ans(x-1,yy)-ans(xx,y-1)+ans(x-1,y-1));
        }
    }
    return 0;
}

 

posted @ 2019-03-29 21:21  Shine_hale  阅读(182)  评论(0编辑  收藏  举报
Live2D