首先二维树状数组肯定开不下

仿照二维树状数组的做法,如果有差分数组$d[i][j]=a[i][j]-a[i-1][j]-a[i][j-1]+a[i-1][j-1]$,那么就有:

$$sum[x][y]=\sum\limits_{i=1}^{x}{\sum\limits_{j=1}^{y}{\sum\limits_{k=1}^{i}{\sum\limits_{l=1}^{j}{d[k][l]}}}}$$

$$=\sum\limits_{i=1}^{x}{\sum\limits_{k=1}^{i}{\sum\limits_{j=1}^{y}{((y+1)d[k][j]-j*d[k][j])}}}$$

$$=\sum\limits_{i=1}^{x}{\sum\limits_{j=1}^{y}{(x+1)(y+1)d[i][j]-(x+1)*j*d[i][j]-(y+1)*i*d[i][j]+i*j*d[i][j]}}$$

所以把询问拆成四个(前缀和)、修改拆成四个(差分))

已经按时间排好序,然后把x作为第二维来cdq,开d,i*d,j*d,i*j*d四个树状数组统计答案就可以了

上帝造题的七分钟也可以这样做,不过常数太大要吸氧

 #include<bits/stdc++.h>
#define pa pair<int,int>
#define CLR(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=1e4+,maxm=3e4+; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} struct Node{
int t,x,y,o;ll v;
Node(int a=,int b=,int c=,int d=,int e=){
t=a,x=b,y=c,v=d,o=e;
}//o==1查 o==0改
}op[maxm*],tmp[maxm*];
ll dd[maxn],id[maxn],jd[maxn],ijd[maxn];
ll ans[maxm];
int N,M;
bool isask[maxm]; inline int lowbit(int x){return x&(-x);}
inline void add(ll *t,int x,ll y){
for(;x<=N;x+=lowbit(x)) t[x]+=y;
}
inline ll query(ll *t,int x){
ll re=;for(;x;x-=lowbit(x)) re+=t[x];return re;
} void cdq(int l,int r){
if(l==r) return;
int m=l+r>>;
cdq(l,m);cdq(m+,r);
int p=l,q=m+,n=;
for(;q<=r;q++){
for(;p<=m&&op[p].x<=op[q].x;p++){
tmp[++n]=op[p];
if(op[p].o!=) continue;
add(dd,op[p].y,op[p].v);
add(id,op[p].y,op[p].v*op[p].x);
add(jd,op[p].y,op[p].v*op[p].y);
add(ijd,op[p].y,op[p].v*op[p].x*op[p].y);
}
tmp[++n]=op[q];
if(op[q].o!=) continue;
ll re=query(dd,op[q].y)*(op[q].x+)*(op[q].y+);
re-=query(id,op[q].y)*(op[q].y+);
re-=query(jd,op[q].y)*(op[q].x+);
re+=query(ijd,op[q].y);
ans[op[q].t]+=re*op[q].v;
}for(;p<=m;p++) tmp[++n]=op[p];
for(int p=l;p<=m&&op[p].x<=op[r].x;p++){
if(op[p].o!=) continue;
add(dd,op[p].y,-op[p].v);
add(id,op[p].y,-op[p].v*op[p].x);
add(jd,op[p].y,-op[p].v*op[p].y);
add(ijd,op[p].y,-op[p].v*op[p].x*op[p].y);
}
memcpy(op+l,tmp+,sizeof(Node)*n);
} int main(){
//freopen("","r",stdin);
int i,j;
N=rd(),M=rd();
for(i=,j=;i<=M;i++){
int a=rd(),x1=rd(),y1=rd(),x2=rd(),y2=rd();
if(!a){
op[++j]=Node(i,x2,y2,,);
if(x1>&&y1>) op[++j]=Node(i,x1-,y1-,,);
if(x1>) op[++j]=Node(i,x1-,y2,-,);
if(y1>) op[++j]=Node(i,x2,y1-,-,);
isask[i]=;
}else{
op[++j]=Node(i,x1,y1,a,);
if(x2<N&&y2<N) op[++j]=Node(i,x2+,y2+,a,);
if(y2<N) op[++j]=Node(i,x1,y2+,-a,);
if(x2<N) op[++j]=Node(i,x2+,y1,-a,);
}
}
cdq(,j);
for(i=;i<=M;i++){
if(isask[i]) printf("%lld\n",ans[i]);
}
return ;
}

suoi44 核能显示屏 (cdq分治)的更多相关文章

  1. suoi21 高能显示屏 (cdq分治)

    可以把翻倍的操作看作是一个查询和修改(增加刚查询得来的值)的符合操作,然后做cdq就行了 #include<bits/stdc++.h> #define pa pair<int,in ...

  2. 【教程】简易CDQ分治教程&学习笔记

    前言 辣鸡蒟蒻__stdcall终于会CDQ分治啦!       CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. CDQ分治的基 ...

  3. BZOJ 2683 简单题 ——CDQ分治

    [题目分析] 感觉CDQ分治和整体二分有着很本质的区别. 为什么还有许多人把他们放在一起,也许是因为代码很像吧. CDQ分治最重要的是加入了时间对答案的影响,x,y,t三个条件. 排序解决了x ,分治 ...

  4. HDU5618 & CDQ分治

    Description: 三维数点 Solution: 第一道cdq分治...感觉还是很显然的虽然题目不能再傻逼了... Code: /*=============================== ...

  5. 初识CDQ分治

    [BZOJ 1176:单点修改,查询子矩阵和]: 1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 200 ...

  6. HDU5322 Hope(DP + CDQ分治 + NTT)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5322 Description Hope is a good thing, which can ...

  7. BZOJ4170 极光(CDQ分治 或 树套树)

    传送门 BZOJ上的题目没有题面-- [样例输入] 3 5 2 4 3 Query 2 2 Modify 1 3 Query 2 2 Modify 1 2 Query 1 1 [样例输出] 2 3 3 ...

  8. BZOJ2683 简单题(CDQ分治)

    传送门 之前听别人说CDQ分治不难学,今天才知道果真如此.之前一直为自己想不到CDQ的方法二很不爽,今天终于是想出来了一道了,太弱-- cdq分治主要就是把整段区间分成两半,然后用左区间的值去更新右区 ...

  9. BNUOJ 51279[组队活动 Large](cdq分治+FFT)

    传送门 大意:ACM校队一共有n名队员,从1到n标号,现在n名队员要组成若干支队伍,每支队伍至多有m名队员,求一共有多少种不同的组队方案.两个组队方案被视为不同的,当且仅当存在至少一名队员在两种方案中 ...

随机推荐

  1. 2.3《想成为黑客,不知道这些命令行可不行》(Learn Enough Command Line to Be Dangerous)——重命名,复制,删除

    最常用的文件操作除了将文件列出来外,就应该是重命名,复制,删除了.正如将文件列出来一样,大多数现代操作系统为这些任务提供了用户图形界面,但是在许多场景中,用命令行还是会更方便. 使用mv命令重命名一个 ...

  2. 20155216 Exp4 恶意代码分析

    20155216 Exp4 恶意代码分析 实践内容 使用schtasks指令监控系统运行 先在C盘目录下建立一个netstatlog.bat文件和netstatlog.txt文件,将记录的联网结果格式 ...

  3. 20155233 《网络对抗》 Exp8 Web基础

    实验内容 Web前端HTML Web前端javascipt Web后端:MySQL基础:正常安装.启动MySQL,建库.创建用户.修改密码.建表 Web后端:编写PHP网页,连接数据库,进行用户认证 ...

  4. 记一次SpringMVC碰到的坑

            在SpringMVC中,我们Controller中接收比如表单的参数,只要保证方法的形参的名字和表单中input元素的的name一样就可以接收到参数.         但是,我开发的一 ...

  5. 汇编 ADD指令

    知识点: 加法汇编指令ADD 一.加法指令 ADD(Addition) 格式 格式: ADD A,B //A=A+B; 功能: 两数相加 . OPRD1为任一通用寄存器或存储器操作数,可以是任意一个 ...

  6. Qt程序修改Ubuntu系统时间

    QString str = QString("sudo date -s %1/%2/%3").arg(iMonth).arg(iDay).arg(iYear); system(st ...

  7. python中获取执行脚本路径方法

    1.sys.path[0]:获取执行脚本目录绝对路径 #每次执行脚本时,python会将执行脚本目录加入PYTHONPATH环境变量中(sys.path获取) #!/usr/bin/python3 i ...

  8. 记录一次 @Autowired 无法注入( spring依赖正常 idea显示有spring已注入的图标)导致空指针异常的原因

    首先,参考 https://blog.csdn.net/weixin_40475523/article/details/81085990 然后发现 是因为我把自己的这个类加上了 @Service 注解 ...

  9. 如何理解nexus

    理解: Nexus即区块链:分布式部署肯定是构建去中心化网络理所当然的解决方向--通过P2P协议将全世界所有节点计算机彼此相互连接,形成一张密密麻麻的网络:以巧妙的机制,通过节点之间的交易数据同步来保 ...

  10. shell 的 export命令

    export 功能说明:设置或显示环境变量.语 法:export [-fnp][变量名称]=[变量设置值]补充说明:在shell中执行程序时,shell会提供一组环境变量.export可新增,修改或删 ...