BZOJ 2683 简单题 ——CDQ分治
【题目分析】
感觉CDQ分治和整体二分有着很本质的区别。
为什么还有许多人把他们放在一起,也许是因为代码很像吧。
CDQ分治最重要的是加入了时间对答案的影响,x,y,t三个条件。
排序解决了x ,分治解决了t ,树状数组解决了y。
时间复杂度,排序log,分治log,树状数组也是log
分治中加入了树状数组,所以复杂度带两个log
而整体二分完全没有时间的先后,所以只有一个log。
CDQ分治,分治的是时间。
整体二分,分治的是答案。
还是很不同的算法。
【代码】
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAXN 800010
#define SIZE 500010
#define lowbit(x) (x&(-x))
using namespace std;
int w;
int top,opt,L,R,l,r,delta,Top;
struct Query
{
int op;
int x,y,A;
int t,id;
bool operator <(const Query& a)const
{
if (x == a.x && y == a.y) return op < a.op;
if (x == a.x) return y < a.y;
return x < a.x;
}
}que[MAXN],newq[MAXN];
long long ans[MAXN],c[SIZE];
inline void in(int &x)
{
x=0;char ch = getchar();
while (!(ch >= '0' && ch <= '9')) ch = getchar();
while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0',ch = getchar();
}
inline void add(int i,long long x)
{
while (i && i <= w) c[i] += x,i += lowbit(i);
}
inline long long query(int i)
{
long long ret = 0;
while (i) ret += c[i],i -= lowbit(i);
return ret;
}
inline void Solve(int l,int r)
{
int mid = (l + r) >> 1,tp1 = l,tp2 = mid + 1;
if (l == r) return;
for (int i = l;i <= r;i++)
{
if (que[i].t <= mid && que[i].op == 1) add(que[i].y,que[i].A);
if (que[i].t > mid && que[i].op == 2) ans[que[i].id] += query(que[i].y) * que[i].A;
}
for (int i = l;i <= r;i++)
if (que[i].t <= mid && que[i].op == 1) add(que[i].y,-que[i].A);
for (int i = l;i <= r;i++)
if (que[i].t <= mid) newq[tp1++] = que[i];
else newq[tp2++] = que[i];
memcpy(que+l,newq+l,sizeof(Query)*(r - l + 1));
Solve(l,mid);Solve(mid+1,r);
}
int main()
{
in(w);
while (1)
{
in(opt);
if (opt == 3) break;
switch (opt)
{
case 1:
in(L);in(R);in(delta);
que[++top].op = opt;que[top].x = L;que[top].y = R;que[top].A = delta;que[top].t = top;
break;
case 2:
in(L);in(R);in(l);in(r);
que[++top].op = opt;que[top].x = L - 1;que[top].y = R - 1;que[top].t = top;que[top].A = 1;que[top].id = ++Top;
que[++top].op = opt;que[top].x = L - 1;que[top].y = r;que[top].t = top;que[top].A = -1;que[top].id = Top;
que[++top].op = opt;que[top].x = l;que[top].y = R - 1;que[top].t = top;que[top].A = -1;que[top].id = Top;
que[++top].op = opt;que[top].x = l;que[top].y = r;que[top].t = top;que[top].A = 1;que[top].id = Top;
break;
}
}
sort(que + 1,que + top + 1);
Solve(1,top);
for (int i = 1;i <= Top;i++) printf("%lld\n",ans[i]);
}
BZOJ 2683 简单题 ——CDQ分治的更多相关文章
- 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,现在需要维护两种操作: ...
- bzoj 1176: [Balkan2007]Mokia&&2683: 简单题 -- cdq分治
2683: 简单题 Time Limit: 50 Sec Memory Limit: 128 MB Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要 ...
- 【BZOJ-1176&2683】Mokia&简单题 CDQ分治
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1854 Solved: 821[Submit][St ...
- BZOJ 2683: 简单题
2683: 简单题 Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 913 Solved: 379[Submit][Status][Discuss] ...
- bzoj2683简单题 cdq分治
2683: 简单题 Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 1803 Solved: 731[Submit][Status][Discuss] ...
- BZOJ 2683: 简单题(CDQ分治 + 树状数组)
BZOJ2683: 简单题(CDQ分治 + 树状数组) 题意: 你有一个\(N*N\)的棋盘,每个格子内有一个整数,初始时的时候全部为\(0\),现在需要维护两种操作: 命令 参数限制 内容 \(1\ ...
- 【BZOJ1176】[Balkan2007]Mokia/【BZOJ2683】简单题 cdq分治
[BZOJ1176][Balkan2007]Mokia Description 维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=1600 ...
随机推荐
- AD域控制器通过组策略禁止USB设备
问题:域环境下如何禁用USB口设备? 第一种:用传统的办法,在Bios中禁用USB. 第二种: 微软技术支持回答:根据您的需求, Windows识别USB设备主要通过两个文件,一个是Usbstor.p ...
- clearfix的应用
之前遇到一个问题,引用Bootstrap框架时 一行显示四个模块,小屏幕时显示两个模块 当内容一样时,大小屏幕时一样的,但是当其中一个和另一个内容不同时,展示效果就会有错乱 <div class ...
- [原创]CSS3打造动态3D气球
周末在江边晨跑的时候发现很多 当时心血来潮就想,应该可以在网页中实现一下 这几天得闲就做了一下,效果如下 (尽量在最新版本的chrome或者firefox中查看) demo下载在文章最后 预览 --& ...
- 解决 release-stripped.ap_' specified for property 'resourceFile' does not exist.
设置buildTypes里的release的shrinkResources为false即可,如果是 release-stripped.ap_' specified for property 'reso ...
- Jquery 轮播图简易框架
=====================基本结构===================== <div class="carousel" style="width: ...
- 将MongoDB服务加入随机启动
将MongoDB服务加入随机启动 vi /etc/rc.local 使用vi编辑器打开配置文件,并在其中加入下面一行代码 /usr/local/mongodb/bin/mongod -dbpath=/ ...
- [SHOI2008]堵塞的交通traffic
我是萌萌的传送门 这题说白了就是一个支持加边和删边的图连通性维护,不过鉴于图的特殊性,可以直接线段树(听说标算就是这个--). 然而我人比较懒,不想思考怎么线段树,于是乎写了一发分治并查集,1A我真是 ...
- SVProgressHUD
原文:http://cht005288201307234627.iteye.com/blog/1927961 SVProgressHUD和MBProgressHUD效果差不多,不过不需要使用协议,同时 ...
- 为WIN8 APP创建置顶desktop应用
Windows 8: TopMost window I am working on my next ambitious project “MouseTouch” which is multi to ...
- NodeJS+Express下构建后端MVC文件结构
关于MVC的结构大体上有两种方式,其一按照层级进行文件夹分类,其二是按照业务进行文件夹分类.关于这个demo相关的业务简单,所以暂采用第一种的方式,当然实际当中很恨复杂的项目可以采用两种方式相结合的方 ...