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名队员,求一共有多少种不同的组队方案.两个组队方案被视为不同的,当且仅当存在至少一名队员在两种方案中 ...
随机推荐
- 软件设计、DDD概念及落地时的一些零碎思考和记录
DDD理解 DDD体现的是对现实的充分尊重. 1.尊重业务现实,领域专家.领域语言等概念 2.尊重团队现实 3.尊重变化 Application 对某一业务线的整体掌控,流程组装,进度管理,存储时机掌 ...
- IDEA创建Scala项目
一.安装插件 见Scala入门篇 二.新建项目 选择new project,其中SBT相当于精简版的maven,其他的待补充.这里选择IDEA 填写信息,选择Scala SDK 在src目录下新建Sc ...
- [GitHub]GitHub for Windows离线安装的方法
这几天一直在尝试安装GitHub for windows ,安装程序是从https://windows.github.com/ 下载到的OneClick 部署程序,版本号为2.11.0.5.可能是因为 ...
- P2371 [国家集训队]墨墨的等式
膜意义下最短路. 把最小的\(a\)抠出来,作为模数\(mod\),然后建点编号为\(0\)到\(mod-1\),对每个数\(a\)连边\((i,(a+i)\mod mod)\)点\(i\)的最短路就 ...
- .Net Core WebApi控制器接收原始请求正文内容
主要目标 在Asp.net Core控制器中,通过自定义格式化程序来映射自定义处理控制器中的“未知”内容. 简单案例 为了演示这个问题,我们用VS2017创建一个默认的Asp.net Core Web ...
- 使用顽灯浏览器执行H5游戏辅助挂机
前一篇<使用Fidder从安卓模拟器获取APP内H5游戏网址>我们获取到了APP内H5游戏的网址,那么接下来我们使用辅助工具做一些日常任务,如:每天晚上20点做副本,定时喊话,自动清理包裹 ...
- 我的小游戏上线海外AppStore完整流程心得
1,购买一台Mac或者用VMWare 安装Mac OS流程,笔者使用VMWare. 先安装Mac OS 10.13,教程,成功后不要着急安装vmtools, 首先更新系统至最新版,因为真机测试往往需要 ...
- 初识Redux Middleware
前言 原先改变store是通过dispatch(action) = > reducer:那Redux的Middleware是什么呢?就是dispatch(action) = > reduc ...
- Git多人协作工作流程
前言 之前一直把Git当做个人版本控制的工具使用,现在由于工作需要,需要多人协作维护文档,所以去简单了解了下Git多人协作的工作流程,发现还真的很多讲解的,而且大神也已经讲解得很清楚了,这里就做一个简 ...
- PHP学习 类型 变量 常数 运算符
PHP支持下列8种类型 标量类型 scalar type整数 integer浮点数 float double布尔 boolean字符串 string 特殊类型 special typeNULL资源 r ...