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名队员,求一共有多少种不同的组队方案.两个组队方案被视为不同的,当且仅当存在至少一名队员在两种方案中 ...
随机推荐
- struts2_文件上传的功能
使用Struts内置的fileUpload拦截器(已默认配置)即可,设计的电商网站,提供用户头像上传的功能 1. 2. 3. 4. 5. 5.未使用拦截器 6.未使用filename 7. 8. 9.
- CF1039E Summer Oenothera Exhibition 根号分治,LCT,ST表
CF1039E Summer Oenothera Exhibition LG传送门 根号分治好题. 可以先看我的根号分治总结. 题意就是给出长度为\(n\)的区间和\(q\)组询问以及一个\(w\), ...
- TClientDataSet 提交时提示 Field value Required 但是未提示具体哪个字段。
TClientDataSet 提交时提示 Field value Required 但是未提示具体哪个字段. 这个错误特别麻烦,要使用 midas 控件时,虽然很方便.但是出错了根本找不到原因,特别是 ...
- libgdx学习记录22——3d物体创建
libgdx是一个强大的游戏框架,不仅支持2d部分,同时还支持3d部分. libgdx的3d部分投影主要通过PerspectiveCamera实现. 物体的显示过程: 1. 创建远景相机,角度一般设为 ...
- C#字符串截取、获取当前电脑时间、判断输入日期对错 随手记
字符串截取:这个就当复习了,看意见就可以 //身份证生日截取 //Console.WriteLine("请输入18位身份证号:"); //string x = Console.Re ...
- Dictionary 对象
Dictionary 对象 对象的存储数据键/项对. 语法 Scripting.Dictionary 说明 Dictionary对象相当于 PERL 关联数组. 项目,可以是任何形式的数据,存储在数组 ...
- 验证Xpath和CSS 路径是否有效
XPath定位和CSS定位在Selenium中是经常使用的. 在FireFox浏览器和Chrome浏览器,可以使用这样的方法来验证定位是否准确. 以Chrome浏览器做范例 按键盘的F12 进入开发者 ...
- 查看Python的版本、内建方法和模块等内容的方法
若想更好地应用Python帮助我们解决日常生活的问题,就必须了解清楚它的内建方法和模块等特性.相信不少同学在安装某个版本的Python后,对于内建方法之类都是一知半解,希望本文能帮助了解Python的 ...
- 由Windows开发平台向Linux平台转移的一些想法
从毕业到现在已经快20年了,一直在从事Windows平台上的开发工作.刚毕业那会大约是97,98年左右,工作的平台除了Windows平台还有Dos平台,因为在学校学习时,也是从Dos开始的.因此对于从 ...
- muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor
目录 muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor Connector 系统函数connect 处理非阻塞connect的步骤: Connetor时序图 Accep ...