SEERC 2018 B. Broken Watch (CDQ分治)
题目链接:http://codeforces.com/gym/101964/problem/B
题意:q 种操作,①在(x,y)处加一个点,②加一个矩阵{(x1,y1),(x2,y2)},问每次操作后点在矩阵中或矩阵边界上的对数有多少。
题解:裸的CDQ分治,考虑对点和矩阵分别进行CDQ分治,因为x,y <= 1e9,要将其中一个坐标离散化。要注意先加点和先加矩阵的两种情况下,矩阵的差分边界是不同的。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset((a),(b),sizeof(a))
#define mp(a,b) make_pair(a,b)
#define pi acos(-1)
#define pii pair<int,int>
#define pb push_back
const int INF = 0x3f3f3f3f;
const double eps = 1e-;
const int MAXN = 1e5 + ;
const int MAXM = 1e8 + ;
const ll mod = 1e9 + ; struct node {
int op, x1, y1, x2, y2, id;
bool operator < (const node &rhs) {
if(x1 != rhs.x1)
return x1 < rhs.x1;
return id < rhs.id;
}
} a[MAXN], b[MAXN << ], c[MAXN << ]; int tot; void addnode(int op, int x1, int y1, int id) {
++tot;
b[tot].op = op, b[tot].x1 = x1, b[tot].y1 = y1, b[tot].id = id;
} int y[MAXN << ], ysz = ;
ll ans[MAXN]; int lowbit(int x) {
return x & (-x);
} ll bit[MAXN << ]; void add(int y, int val) {
while(y <= ysz) {
bit[y] += val;
y += lowbit(y);
}
} ll query(int y) {
ll sum = ;
while(y) {
sum += bit[y];
y -= lowbit(y);
}
return sum;
} void cdq(int l, int r) {
if(l == r)
return ;
int mid = (l + r) >> ;
cdq(l, mid);
cdq(mid + , r);
int len = ;
for(int i = l; i <= mid; i++)
if(b[i].id == )
c[++len] = b[i];
for(int i = mid + ; i <= r; i++)
if(b[i].id)
c[++len] = b[i];
if(len == || c[].id || c[len].id == )
return ;
sort(c + , c + + len);
for(int i = ; i <= len; i++) {
if(c[i].id == )
add(c[i].y1, c[i].op);
else
ans[c[i].id] += 1ll * c[i].op * query(c[i].y1);
}
for(int i = ; i <= len; i++)
if(c[i].id == )
add(c[i].y1, -c[i].op);
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
mst(ans, );
int q;
scanf("%d", &q);
for(int i = ; i <= q; i++) {
scanf("%d%d%d", &a[i].op, &a[i].x1, &a[i].y1);
y[++ysz] = a[i].y1;
if(a[i].op == ) {
scanf("%d%d", &a[i].x2, &a[i].y2);
y[++ysz] = a[i].y2;
}
}
sort(y + , y + + ysz);
ysz = unique(y + , y + + ysz) - y - ;
for(int i = ; i <= q; i++) {
a[i].y1 = lower_bound(y + , y + + ysz, a[i].y1) - y;
if(a[i].op == )
a[i].y2 = lower_bound(y + , y + + ysz, a[i].y2) - y;
}
tot = ;
for(int i = ; i <= q; i++) {
if(a[i].op == ) {
addnode(, a[i].x1, a[i].y1, );
} else {
addnode(, a[i].x1 - , a[i].y1 - , i);
addnode(-, a[i].x2, a[i].y1 - , i);
addnode(-, a[i].x1 - , a[i].y2, i);
addnode(, a[i].x2, a[i].y2, i);
}
}
cdq(, tot);
tot = ;
for(int i = ; i <= q; i++) {
if(a[i].op == ) {
addnode(, a[i].x1, a[i].y1, i);
} else {
addnode(, a[i].x1, a[i].y1, );
addnode(-, a[i].x2 + , a[i].y1, );
addnode(-, a[i].x1, a[i].y2 + , );
addnode(, a[i].x2 + , a[i].y2 + , );
}
}
cdq(, tot);
for(int i = ; i <= q; i++) {
ans[i] += ans[i - ];
printf("%lld\n", ans[i]);
}
return ;
}
SEERC 2018 B. Broken Watch (CDQ分治)的更多相关文章
- 2018.10.01 bzoj3237: [Ahoi2013]连通图(cdq分治+并查集)
传送门 cdq分治好题. 对于一条边,如果加上它刚好连通的话,那么删掉它会有两个大集合A,B.于是我们先将B中禁用的边连上,把A中禁用的边禁用,再递归处理A:然后把A中禁用的边连上,把B中禁用的边禁用 ...
- 2018.06.30 cdq分治
#cdq分治 ##一种奇妙的分治方法 优点:可以顶替复杂的高级数据结构:常数比较小. 缺点:必须离线操作. CDQ分治的基本思想十分简单.如下: 我们要解决一系列问题,包含修改和查询操作,我们将这些问 ...
- 2018-2019 ACM-ICPC Southeastern European Regional Programming Contest (SEERC 2018)
layout: post title: 2018-2019 ACM-ICPC Southeastern European Regional Programming Contest (SEERC 201 ...
- 2018-2019 ACM-ICPC Southeastern European Regional Programming Contest (SEERC 2018) Solution
A. Numbers Unsolved. B. Broken Watch Solved. 题意: 一个圆盘上,有等分的n块区域,有三根指针,当三根指针分别位于两块区域的交界处时 指针的三点相连会形成一 ...
- [CQOI2011]动态逆序对 CDQ分治
洛谷上有2道相同的题目(基本是完全相同的,输入输出格式略有不同) ---题面--- ---题面--- CDQ分治 首先由于删除是很不好处理的,所以我们把删除改为插入,然后输出的时候倒着输出即可 首先这 ...
- 【教程】简易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 ...
随机推荐
- 如何用IDEA创建springboot(maven)并且整合mybatis连接mysql数据库和遇到的问题
一.New->Project 二.点击next 三.在Group栏输入组织名,Artifact就是项目名.选择需要的java版本,点击next 四.添加需要的依赖 在这里我们也可以添加sql方面 ...
- 华为S5700系列交换机配置文件导出、导入
一.导出 配置用户名密码,使能ftp ftp server enable aaa local-user putty password cipher putty123 local-user putty ...
- js — 基础知识
目录 1. js的介绍 2. js的引入方式 3. js语句 4. 变量 js ( Javascript ) - 脚本语言 1. js的介绍 Javascript是一种运行在浏览器中的解释型的编程语言 ...
- linux运维命令3
1.grep 逐行搜索所指定的文件或标准输入,并显示匹配模式的每一行. grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C& ...
- MySQL5.7主从同步配置
主从同步,将主服务器(master)上的数据复制到从服务器(slave). 应用场景 读写分离,提高查询访问性能,有效减少主数据库访问压力. 实时灾备,主数据库出现故障时,可快速切换到从数据库. 数据 ...
- Centos7.3 为php7 安装swoole 扩展
今天心血来潮想在服务器上安装一下swoole扩展 下面列一下教程: xshell进入你的服务器 然后目录自选吧 反正我放在根目录了 下面是扩展链接: wget https://github.co ...
- (八)Activiti之流程变量和局部流程变量
一.流程变量 1.1 概念 如果,当流程走到"学生请假"这个任务节点的时候,此时可以用TaskService设置流程变量,变量值包含请假人.请假时间.请假理由等信息,这些信息存在表 ...
- 使用隔离级别read committed隐式解决并发冲突
1.使用rc的弊端:出现不可重复读 Oracle不可重复读 Oracle丢失修改 Oracle幻读 任何数据库的update insert delete都加排它锁 sql server的selec ...
- powerdesign中逆向工程后name和comment的互换
powerdesign 中,将数据库中可以逆向生成pdm的结构图,比较清晰看到系统的结构, 但假如是db先行的话,一般是db中的每个列中用comment中文注释说明这列是 干什么的,但逆向工程后,会发 ...
- Joy OI【走廊泼水节】题解--最小生成树推论变式
题目链接: http://joyoi.org/problem/tyvj-1391 思路: 首先这需要一个推论: "给定一张无向图,若用\(k(k<n-1)\)条边构成一个生成森林(可以 ...