Luogu p4514 上帝造题的七分钟 题解 二维树状数组

题目链接
裸体(题)就意味着身体(神题)
标准全裸二维树状数组
因为这道题二维线段树好像会爆空间,所以二维树状数组是最好的写法了

二维树状数组十分的胡扯玄幻,通过一个乱七八糟二维的差分来实现二维区间快速修改查询。

但是你以为你会二维树状数组就一定能过吗?这道题有一个猥琐卡人的地方,那就是卡常了。
这道题卡常很严重,正常写法都会t掉。这时候,有两种方法可以过掉

一,吸吸氧
luogu现在有了O2优化这种骚气的操作,所以普通写法+O2优化稳定可以过。

二,使用黑科技
在读入输出优化打满后,继续在所有调用的函数过程前加inline。不要问我为什么会快,毕竟我也不知道。但是这个东西真的能使程序快很多。

注意:读入时要手写readc,不能直接getchar(),不然你就会像笔者一样体会到一直TLE一个点以及RE九个点还找不到问题所在的痛苦

具体代码如下

#include<bits/stdc++.h>
using namespace std;
int n,m,tree[2050][2050][5],a,b,c,d;
int lowbit(int x){return x&-x;};
inline int read(){
       int s=0,f=1;char c=getchar();
       for(;!isdigit(c);c=getchar())if(c=='-')f=-1;
       for(;isdigit(c);c=getchar())s=(s<<3)+(s<<1)+(c^48);
       return s*f;
}
inline void print(int x){
	if(x>9)print(x/10);
	putchar(x%10+'0');
}
inline void write(int x){
	if(x<0){x=-x;putchar('-');}
	print(x);putchar('\n');
}
inline void add(int x,int y,int k){
    for(int i=x;i<=n;i+=lowbit(i))
        for(int j=y;j<=m;j+=lowbit(j)){
            tree[i][j][0]+=k;tree[i][j][1]+=k*x;
            tree[i][j][2]+=k*y;tree[i][j][3]+=k*x*y;
        }
}
inline int sum(int x,int y){
    int ans=0;
    for(int i=x;i!=0;i-=lowbit(i)){
        for(int j=y;j!=0;j-=lowbit(j)){
            ans+=tree[i][j][0]*(x*y+x+y+1)-tree[i][j][1]*(y+1)-tree[i][j][2]*(x+1)+tree[i][j][3];
        }
    }
    return ans;
}
inline char readc(){
	char c=getchar();
	while(c!=EOF&&!isalpha(c))c=getchar();
	return c;
}
int main(){
    n=read();m=read();
    char opt=readc();
    while(opt!=EOF){
        a=read(),b=read(),c=read(),d=read();
        if(opt=='L'){
            int s=read();
            add(a,b,s);add(c+1,d+1,s);
            add(a,d+1,-s);add(c+1,b,-s);
        }
        else{
            write(sum(c,d)-sum(a-1,d)-sum(c,b-1)+sum(a-1,b-1));
        }
        opt=readc();
    }	
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值