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 ...
随机推荐
- JavaScript原型
prototype与_proto_ 对象的 prototype 属性的方法.属性为对象所属的那一"类"所共有.对象原型链通过 proto 属性向上寻找. 为 proto 指定 nu ...
- java开发问题总结-4-Maven使用问题汇总
Non-resolvable parent POM [INFO] Scanning for projects... [ERROR] The build could not read 1 project ...
- 网络第二节——AFNworking
/** 要使用常规的AFN网络访问 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; ...
- Linux学习之三--scp命令
scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器 ...
- HDU5934 强连通分量
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5934 根据距离关系建边 对于强连通分量来说,只需引爆话费最小的炸弹即可引爆整个强连通分量 将所有的强连通分 ...
- hdu 4329
problem:http://acm.hdu.edu.cn/showproblem.php?pid=4329 题意:模拟 a. p(r)= R'/i rel(r)=(1||0) R ...
- python的反转(切片)
看下面代码吧,简单来说不如直接看代码.如下: #coding=utf-8 __author__ = 'debude' a = 'python' print a[::-1] #从最后n开始,每走一位都打 ...
- HBase 基本shell命令
- javascript 性能惰性加载2016.12.13
利用函数的惰性载入提高 javascript 代码性能 原文:利用函数的惰性载入提高javascript代码性能 作者:阿安 在 javascript 代码中,因为各浏览器之间的行为的差异,我们经常会 ...
- Selenium Xpath Tutorials - Identifying xpath for element with examples to use in selenium
Xpath in selenium is close to must required. XPath is element locator and you need to provide xpath ...