suoi44 核能显示屏 (cdq分治)
首先二维树状数组肯定开不下
仿照二维树状数组的做法,如果有差分数组$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分治)的更多相关文章
- suoi21 高能显示屏 (cdq分治)
可以把翻倍的操作看作是一个查询和修改(增加刚查询得来的值)的符合操作,然后做cdq就行了 #include<bits/stdc++.h> #define pa pair<int,in ...
- 【教程】简易CDQ分治教程&学习笔记
前言 辣鸡蒟蒻__stdcall终于会CDQ分治啦! CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. CDQ分治的基 ...
- BZOJ 2683 简单题 ——CDQ分治
[题目分析] 感觉CDQ分治和整体二分有着很本质的区别. 为什么还有许多人把他们放在一起,也许是因为代码很像吧. CDQ分治最重要的是加入了时间对答案的影响,x,y,t三个条件. 排序解决了x ,分治 ...
- HDU5618 & CDQ分治
Description: 三维数点 Solution: 第一道cdq分治...感觉还是很显然的虽然题目不能再傻逼了... Code: /*=============================== ...
- 初识CDQ分治
[BZOJ 1176:单点修改,查询子矩阵和]: 1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 200 ...
- HDU5322 Hope(DP + CDQ分治 + NTT)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5322 Description Hope is a good thing, which can ...
- 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 ...
- BZOJ2683 简单题(CDQ分治)
传送门 之前听别人说CDQ分治不难学,今天才知道果真如此.之前一直为自己想不到CDQ的方法二很不爽,今天终于是想出来了一道了,太弱-- cdq分治主要就是把整段区间分成两半,然后用左区间的值去更新右区 ...
- BNUOJ 51279[组队活动 Large](cdq分治+FFT)
传送门 大意:ACM校队一共有n名队员,从1到n标号,现在n名队员要组成若干支队伍,每支队伍至多有m名队员,求一共有多少种不同的组队方案.两个组队方案被视为不同的,当且仅当存在至少一名队员在两种方案中 ...
随机推荐
- 树上三角形 BZOJ3251
分析: 模拟赛T3,其实很水,当时出于某些原因,没有去写这道题... len>46必定有解 为了满足不是三角形,那么斐波那契数列是最优选择,而斐波那契数列的第46项超过了2^31-1,所以超过4 ...
- 领域驱动设计理解&总结
领域驱动设计理解&总结 这篇文章主要是通读<实现领域驱动设计>之后自己的理解和总结(同时也参照一些博文的分析来加深自己的理解): 有些疑问是自定义内容,虽然有自己的理解,但依然感觉 ...
- R语言的数据输入
既然了解了R语言的基本数据类型,那么如何将庞大的数据送入R语言进行处理呢?送入的数据又是如何在R语言中进行存储的呢?处理这些数据的方法又有那些呢?下面我们一起来探讨一下. 首先,数据输入最直接最直观的 ...
- 20155232《网络对抗》Exp7 网络欺诈防范
20155232<网络对抗>Exp7 网络欺诈防范 一.实践内容 本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法.具体实践有 (1)简单应用SET工具建立冒名网 ...
- 20155238 实验四 Android程序设计
Android 安装Android Studio 按照教程依次完成安装步骤.安装所存的相应文件夹必须纯英文,不能出现特殊字符. 32位系统和64位系统是同一个安装文件.启动程序中32位与64位都有.根 ...
- Qt 的线程与事件循环
Qt 的线程与事件循环
- helloworld讲解cocos2d-x的编程思路与要点
用helloworld讲解cocos2d-x的编程思路与要点 本文以cocos2d-x的helloworld为例,讲解cocos2d-x引擎的特点和要点,2.2为了展示新功能,把包括屏幕自适应在内的新 ...
- 您需要来自XXX的权限才能对此文件夹进行更改
解决办法: cmd命令:del/f/s/q 文件夹
- kubernetes 集群新增node 节点并将应用分配到新增节点
第一章 1.重新安装一台kubernetes node节点,新增节点:192.168.1.192 网址:https://www.cnblogs.com/zoulixiang/p/9504324.htm ...
- Linux使用expect实现免手动密码输入,linux免密码登陆
使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄.收藏.可是为什么要这么写却不知其然.本文用一个最短的例子说明脚本的原理. 脚本代码如下: ###### ...