Bzoj2683 简单题 [CDQ分治]
Time Limit: 50 Sec Memory Limit: 128 MB
Submit: 1071 Solved: 428
Description
|
命令 |
参数限制 |
内容 |
|
1 x y A |
1<=x,y<=N,A是正整数 |
将格子x,y里的数字加上A |
|
2 x1 y1 x2 y2 |
1<=x1<= x2<=N 1<=y1<= y2<=N |
输出x1 y1 x2 y2这个矩形内的数字和 |
|
3 |
无 |
终止程序 |
Input
Output
Sample Input
1 2 3 3
2 1 1 3 3
1 2 2 2
2 2 2 3 4
3
Sample Output
5
HINT
Source
CDQ分治
第4遍回顾之前抄的代码的时候,突然顿悟。
个人理解,这种分治方法类似于做矩形面积并时候用到的扫描线法。将每个区间修改操作拆成插入/删除,和每个询问操作一起按横坐标x升序排序。
用一个一维数组记录“当前横坐标”对应的y轴情况,从左往右扫描所有操作,并用差分的方式完成修改(在时间维度上差分),记录答案。
↑该一维数组可以用树状数组优化,扫描操作可以用分治方法优化(每层分治时处理前半部分操作对后半部分查询的影响)。
↑组合起来就成了CDQ分治。
________
PS1: 这时我想起,两三个个月前RLQ说他研究出一种用树状数组乱搞二维大数据的做法,当时没怎么听懂,也没太在意……卧槽,原来是CDQ分治?
CDQ分治要是晚出现两年,就变成RLQ分治了……%%%%%
PS2: 之前抄的LCT也已经回顾了10+遍了,是不是也快要顿悟了呢……
________
/*by SilverN*/
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
const int mxn=;
int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int n;
struct opt{
int flag;
int x,y,w;
int t;
int id;
}a[mxn*],b[mxn*];
int cnt=;
int cmp(opt q,opt e){
if(q.x==e.x){
if(q.y==e.y)return q.flag<e.flag;
return q.y<e.y;
}
return q.x<e.x;
}
int ans[mxn];
int t[mxn*];
void add(int x,int v){while(x<=n){t[x]+=v;x+=x&-x;}return;}
int sum(int x){
int res=;
while(x){res+=t[x];x-=x&-x;}
return res;
}
void solve(int l,int r){
if(l>=r)return;
int i,j,mid=(l+r)>>;
int l1=l,l2=mid+;
for(i=l;i<=r;i++){
if(a[i].flag== && a[i].t<=mid) add(a[i].y,a[i].w);
else if(a[i].flag== && a[i].t>mid) ans[a[i].id]+=sum(a[i].y)*a[i].w;
}
for(i=l;i<=r;i++)
if(a[i].flag== && a[i].t<=mid) add(a[i].y,-a[i].w);
for(i=l;i<=r;i++)
if(a[i].t<=mid)b[l1++]=a[i];
else b[l2++]=a[i];
for(i=l;i<=r;i++)a[i]=b[i];
solve(l,mid);solve(mid+,r);
return;
}
int main(){
n=read();
int i,j,x,y,c,v;
int id=;
while(){
c=read();
if(c==)break;
if(c==){//修改
x=read();y=read();v=read();
a[++cnt].flag=;a[cnt].x=x;a[cnt].y=y;a[cnt].w=v;
a[cnt].t=cnt;
}
else{//查询
x=read();y=read();c=read();v=read();
a[++cnt].flag=;a[cnt].x=x-;a[cnt].y=y-;
a[cnt].w=;a[cnt].t=cnt;a[cnt].id=++id;
a[++cnt].flag=;a[cnt].x=x-;a[cnt].y=v;
a[cnt].w=-;a[cnt].t=cnt;a[cnt].id=id;
a[++cnt].flag=;a[cnt].x=c;a[cnt].y=y-;
a[cnt].w=-;a[cnt].t=cnt;a[cnt].id=id;
a[++cnt].flag=;a[cnt].x=c;a[cnt].y=v;
a[cnt].w=;a[cnt].t=cnt;a[cnt].id=id;
}
}
sort(a+,a+cnt+,cmp);
solve(,cnt);
for(i=;i<=id;i++){
printf("%d\n",ans[i]);
}
return ;
}
Bzoj2683 简单题 [CDQ分治]的更多相关文章
- bzoj2683简单题 cdq分治
2683: 简单题 Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 1803 Solved: 731[Submit][Status][Discuss] ...
- BZOJ2683: 简单题(cdq分治 树状数组)
Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 2142 Solved: 874[Submit][Status][Discuss] Descripti ...
- 【BZOJ1176】[Balkan2007]Mokia/【BZOJ2683】简单题 cdq分治
[BZOJ1176][Balkan2007]Mokia Description 维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=1600 ...
- 【bzoj1176】[Balkan2007]Mokia/【bzoj2683】简单题 CDQ分治+树状数组
bzoj1176 题目描述 维护一个W*W的矩阵,初始值均为S(题目描述有误,这里的S没有任何作用!).每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数 ...
- 【BZOJ-1176&2683】Mokia&简单题 CDQ分治
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1854 Solved: 821[Submit][St ...
- bzoj 1176: [Balkan2007]Mokia&&2683: 简单题 -- cdq分治
2683: 简单题 Time Limit: 50 Sec Memory Limit: 128 MB Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要 ...
- BZOJ 2683: 简单题 [CDQ分治]
同上题 那你为什么又发一个? 因为我用另一种写法又写了一遍... 不用排序,$CDQ$分治的时候归并排序 快了1000ms... #include <iostream> #include ...
- BZOJ 2683 简单题 cdq分治+树状数组
题意:链接 **方法:**cdq分治+树状数组 解析: 首先对于这道题,看了范围之后.二维的数据结构是显然不能过的.于是我们可能会考虑把一维排序之后还有一位上数据结构什么的,然而cdq分治却可以非常好 ...
- BZOJ 2683: 简单题(CDQ 分治)
题面 Time Limit: 50 Sec Memory Limit: 128 MB Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: ...
随机推荐
- 由于 ASP.NET 进程标识对全局程序集缓存没有读权限,因此未能执行请求。错误: 0x80131902
由于 ASP.NET 进程标识对全局程序集缓存没有读权限,因此未能执行请求.错误: 0x80131902 分类: c#2013-06-17 10:22 89人阅读 评论(0) 收藏 举报 ASP.NE ...
- 无法连接windows虚拟机oracle的解决办法
在mac机上玩基于oracle db的开发真心不容易,oracle公司死活不出oracle express edition for mac OS,曾经发布过的oracle 10 for mac下载地址 ...
- 常用hadoop web
http://localhost:50070 Hadoop服务 http://localhost:8088/ 集群中的所有应用程序 http://localhost:16010 hbase
- MVC架构设计——EF-Code First
详情参考:http://www.cnblogs.com/guomingfeng/archive/2013/05/28/mvc-ef-repository.html
- FlashFXP|FTP
经典的FTP传输工具FlashFxp,留作几年吧!看和曾经用的软件代表着岁月的流逝和时间的推进性! 洒脱度过生活中的每一天.每一分钟,Mvpbang追随一生! 压缩包中有秘钥文件-flashfxp.k ...
- DLL丢失修复
DLL丢失修复,简答傻瓜式! DirectX修复工具(DirectX Repair)是一款系统级工具软件,简便易用.本程序为绿色版,无需安装,可直接运行. 本程序的主要功能是检测当前系统的Dir ...
- EditPlus v4.5 简体中文
优秀的代码编辑器! 下载地址: EditPlus v4.00 build 465 简体中文汉化增强版 http://yunpan.cn/cVCSIZsKK7VFF 访问fe58 http://p ...
- iOS 监听textfield的输入(转)
1:首先 [textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEvent ...
- Ueditor 上传图片 如何设置只显示 本地上传
我这个是自问自答,其实很简单.只要按照以下方式修改就可以了. 找到image.html 将以下代码 <div id="tabHeads" class="tabhea ...
- Retrofit 2.1 入门
Retrofit 2.1入门 , map); try { Response<String>body=call.execute(); System.out. ...