传送门

之前听别人说CDQ分治不难学,今天才知道果真如此。之前一直为自己想不到CDQ的方法二很不爽,今天终于是想出来了一道了,太弱……

cdq分治主要就是把整段区间分成两半,然后用左区间的值去更新右区间的答案,每次把区间折半。对于本题来说时间复杂度T(N)=T(N/2)+O(NlogN)

T(N)=O(Nlog2N)

/**************************************************************
Problem: 2683
Language: C++
Result: Accepted
Time:6204 ms
Memory:35184 kb
****************************************************************/ #include <cstdio>
#include <algorithm>
using namespace std;
#define MAXN 200005
struct Node {
int t, x, y, v, k;
inline bool operator < (const Node&r) const {
if(x == r.x && y == r.y) return t < r.t;
else if(x == r.x) return y < r.y;
else return x < r.x;
}
} q[MAXN << 2], nq[MAXN << 2];
int n, cnt, ans;
inline void GET(int &n) {
n = 0; char c;
do c = getchar(); while('0' > c || c > '9');
do n = n * 10 + c - '0', c = getchar(); while('0' <= c && c <= '9');
}
namespace BIT {
int t[MAXN << 2];
inline void Add(int x, int v) {
for(; x <= n; x += x&-x) t[x] += v;
}
inline int Query(int x, int s = 0) {
for(; x; x -= x&-x) s+=t[x];
return s;
}
}
void cdq(int l, int r) {
if(l >= r) return;
using namespace BIT;
int mid = (l + r) >> 1, lp = l, rp = mid+1;
for(int i = l; i <= r; ++ i)
if(q[i].t <= mid && q[i].k == 1) Add(q[i].y, q[i].v);
else if(q[i].t > mid && q[i].k == 2) q[i].v += Query(q[i].y);
for(int i = l; i <= r; ++ i) {
if(q[i].t <= mid && q[i].k == 1) Add(q[i].y, -q[i].v);
if(q[i].t <= mid) nq[lp ++] = q[i];
else nq[rp ++] = q[i];
}
for(int i = l; i <= r; ++ i) q[i] = nq[i];
cdq(l, mid); cdq(mid+1, r);
}
int main() {
scanf("%d", &n);
int op, x, y, a, b;
while(~scanf("%d", &op) && 3 != op) {
if(1 == op) {
GET(x); GET(y); GET(a);
q[++ cnt] = { cnt, x, y, a, 1 };
}
else {
GET(x); GET(y); GET(a); GET(b);
q[++ cnt] = { cnt, x-1, y-1, 0, 2 };
q[++ cnt] = { cnt, x-1, b, 0, 2 };
q[++ cnt] = { cnt, a, y-1, 0, 2 };
q[++ cnt] = { cnt, a, b, 0, 2 };
}
}
sort(q+1, q+cnt+1);
cdq(1, cnt);
for(int i = 1; i <= cnt; ++ i)
if(q[i].k == 2) {
ans = q[i].v - q[i+1].v - q[i+2].v + q[i+3].v;
printf("%d\n", ans); i += 3;
}
return 0;
}

BZOJ2683 简单题(CDQ分治)的更多相关文章

  1. bzoj2683简单题 cdq分治

    2683: 简单题 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 1803  Solved: 731[Submit][Status][Discuss] ...

  2. BZOJ2683: 简单题(cdq分治 树状数组)

    Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 2142  Solved: 874[Submit][Status][Discuss] Descripti ...

  3. Bzoj2683 简单题 [CDQ分治]

    Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 1071  Solved: 428 Description 你有一个N*N的棋盘,每个格子内有一个整数, ...

  4. 【BZOJ1176】[Balkan2007]Mokia/【BZOJ2683】简单题 cdq分治

    [BZOJ1176][Balkan2007]Mokia Description 维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=1600 ...

  5. 【bzoj1176】[Balkan2007]Mokia/【bzoj2683】简单题 CDQ分治+树状数组

    bzoj1176 题目描述 维护一个W*W的矩阵,初始值均为S(题目描述有误,这里的S没有任何作用!).每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数 ...

  6. 【BZOJ-1176&2683】Mokia&简单题 CDQ分治

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 1854  Solved: 821[Submit][St ...

  7. bzoj 1176: [Balkan2007]Mokia&&2683: 简单题 -- cdq分治

    2683: 简单题 Time Limit: 50 Sec  Memory Limit: 128 MB Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要 ...

  8. BZOJ 2683: 简单题 [CDQ分治]

    同上题 那你为什么又发一个? 因为我用另一种写法又写了一遍... 不用排序,$CDQ$分治的时候归并排序 快了1000ms... #include <iostream> #include ...

  9. BZOJ 2683 简单题 cdq分治+树状数组

    题意:链接 **方法:**cdq分治+树状数组 解析: 首先对于这道题,看了范围之后.二维的数据结构是显然不能过的.于是我们可能会考虑把一维排序之后还有一位上数据结构什么的,然而cdq分治却可以非常好 ...

  10. BZOJ 2683: 简单题(CDQ 分治)

    题面 Time Limit: 50 Sec  Memory Limit: 128 MB Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: ...

随机推荐

  1. JSP计算器

    <%@ page language= "java" contentType="text/html;charset=UTF-8" %><html ...

  2. nginx实现动静分离

    环境信息如下: 测试目的: 访问jpg文件的时候,会请求到192.168.1.106上面 访问其他文件会请求到192.168.1.103上面 nginx的安装详见前面的文章 nginx的配置如下 wo ...

  3. C语言学习笔记(二)_system系统调用及posix说明

    1.9 System系统调用 System库函数的功能是执行操作系统的命令或者运行指定的程序.system库函数的调用需要#include<stdlib.h>这个头文件. #include ...

  4. oracle 字符转字符串函数

    select cast('addd' as varchar(4)) from dual;

  5. allegro - 层叠相关参数

      层叠结构设置 弹出Layout Cross Section对话框 Subclass Name一列是该层的名称,可以按照自己的需要来填写.Type 列选择该层的类型,有三种: ·CONDUCTOR: ...

  6. python 协程

    协程 协程就是一种用户态内的上下文切换技术. 1.使用gevent实现协程, gevent.spawn()调用函数,  gevent.sleep(1) 模拟阻塞,实现切换. import gevent ...

  7. wamp如何添加多个站点

    1.打开wamp目录下的bin目录下的apache/conf/extra/httpd-vhosts.conf文件(虚拟目录配置文件),修改文件:在num01下创建index.php文件,输出01,:在 ...

  8. zabbix微信告警实践

    首先你得有个企业号!!!具体操作步骤可以参考http://itnihao.blog.51cto.com/1741976/1733245,里面写的很详细就不重复了. 微信公众号注册并配置完成后,还需要让 ...

  9. 分享自制的13套 JQuery Mobile 界面主题(追加4套新款)

    15套整合在一起的,其中2套官方+13套自制,款款精致,方便移动开发. 字体默认为微软雅黑. 适配于 JQuery Mobile 1.4.3 下载地址:http://files.cnblogs.com ...

  10. php 中遍历数组时使用引用出现的问题

    今天在使用foreach遍历数组时发现,当使用&时会出现问题: $arr = array( array('id' => 100, 'error'=> 'aa'), array('i ...