救救孩子……抱灵求助
查看原帖
救救孩子……抱灵求助
311001
_十十十十_楼主2020/7/7 16:27

RT。和题解都对了30min了。。。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define _for(i,a,b) for(register int (i)=(a);(i)<=(b);(i)++)
#define For(i,a,b) for(register int (i)=(a);(i)>=(b);(i)--)
#define INF 0x7fffffff
#define il inline
#define rg register
inline long long read(){
    long long num=0;int z=1;char c=getchar();
    if(c=='-') z=-1;
    while((c<'0'||c>'9')&&c!='-') c=getchar();
    if(c=='-') z=-1,c=getchar();
    while(c>='0'&&c<='9') num=(num<<1)+(num<<3)+(c^48),c=getchar();
    return z*num;
}
const int maxn=2e3+5;
int n,m;
class Tree{
    public:
        int c[maxn][maxn];
        il void change(int x,int y,int k);
        il int ask(int x,int y);
}T,Ti,Tj,Tij;
il void Tree::change(int x,int y,int k){
    for(;x<=n;x+=x&-x) for(;y<=m;y+=y&-y) c[x][y]+=k;
    return ;
}
il int Tree::ask(int x,int y){
    int ans=0;
    for(;x;x-=x&-x) for(;y;y-=y&-y) ans+=c[x][y];
    return ans;
}
il int sum(int x,int y){
    return T.ask(x,y)*(x+1)*(y+1)-Ti.ask(x,y)*(y+1)-Tj.ask(x,y)*(x+1)+Tij.ask(x,y);
}
il void add(int x,int y,int d){
    T.change(x,y,d),Ti.change(x,y,d*x),Tj.change(x,y,d*y),Tij.change(x,y,d*x*y);
    return ;
}
char c[3];
int main(){
    n=read(),m=read();
    for(;~scanf("%s",&c);){
        int l1=read(),r1=read(),l2=read(),r2=read();
        // printf("%d %d %d %d\n",l1,r1,l2,r2);
        if(c[0]=='L'){
            int val=read();
            add(l1,r1,val);
            add(l1,r2+1,-val);
            add(l2+1,r1,-val);
            add(l2+1,r2+1,val);
        }
        else printf("%d\n",sum(l2,r2)-sum(l1-1,r2)-sum(l2,r1-1)+sum(l1-1,r1-1));
    }
    return 0;
}
2020/7/7 16:27
加载中...