先cdq分治, 然后要处理点对答案的贡献, 可以以询问点为中心分成4个区域, 然后去掉绝对值(4种情况讨论), 用BIT维护就行了.

--------------------------------------------------------------

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
 
using namespace std;
 
#define c(i) o[c[i]]
#define q(i) o[q[i]]
#define H(v) (lower_bound(h, h + n, v) - h)
 
const int maxn = 1000009;
const int INF = 0x3F3F3F3F;
 
inline int read() {
char c = getchar();
int ret = 0;
for(; !isdigit(c); c = getchar());
for(; isdigit(c); c = getchar())
ret = ret * 10 + c - '0';
return ret;
}
 
inline void Max(int &x, int t) {
if(t > x)
x = t;
}
inline void Min(int &x, int t) {
if(t < x)
x = t;
}
 
struct O {
int t, x, y;
O(int _t = 0, int _x = 0, int _y = 0) : t(_t), x(_x), y(_y) {
}
} o[maxn];
 
int N, n, q[maxn], qn, c[maxn], cn, h[maxn], ans[maxn], F;
 
bool cmp(const int &l, const int &r) {
return o[l].x < o[r].x;
}
 
void Init() {
N = read();
int m = read();
for(int i = 0; i < N; i++) {
int x = read(), y = read();
o[i] = O(1, x, y);
}
for(int i = 0; i < m; i++) {
int t = read(), x = read(), y = read();
o[i + N] = O(t, x, y);
}
N += m;
for(int i = 0; i < N; i++)
if(o[i].t == 2) ans[i] = INF;
F = 0;
}
 
struct BIT {
int b[maxn], Mk[maxn];
BIT() {
memset(Mk, -1, sizeof Mk);
memset(b, -INF, sizeof b);
}
inline void Add(int x, int v) {
for(; x <= n; x += x & -x)
if(Mk[x] != F)
Mk[x] = F, b[x] = v;
else
Max(b[x], v);
}
inline int Query(int x) {
int ret = -INF;
for(; x; x -= x & -x)
if(Mk[x] == F) Max(ret, b[x]);
return ret;
}
} Bit;
 
void Work() {
if(!qn || !cn)
return;
sort(q, q + qn, cmp);
sort(c, c + cn, cmp);
n = 0;
for(int i = 0; i < cn; i++)
h[n++] = c(i).y;
for(int i = 0; i < qn; i++)
h[n++] = q(i).y;
sort(h, h + n);
n = unique(h, h + n) - h;
F++;
for(int i = 0, _cn = 0; i < qn; i++) {
while(_cn < cn && c(_cn).x <= q(i).x) {
Bit.Add(H(c(_cn).y) + 1, c(_cn).x + c(_cn).y);
_cn++;
}
Min(ans[q[i]], q(i).x + q(i).y - Bit.Query(H(q(i).y) + 1));
}
F++;
for(int i = qn, _cn = cn - 1; i--; ) {
while(_cn >= 0 && c(_cn).x >= q(i).x) {
Bit.Add(H(c(_cn).y + 1), c(_cn).y - c(_cn).x);
_cn--;
}
Min(ans[q[i]], q(i).y - q(i).x - Bit.Query(H(q(i).y) + 1));
}
F++;
for(int i = 0, _cn = 0; i < qn; i++) {
while(_cn < cn && c(_cn).x <= q(i).x) {
Bit.Add(n - H(c(_cn).y), c(_cn).x - c(_cn).y);
_cn++;
}
Min(ans[q[i]], q(i).x - q(i).y - Bit.Query(n - H(q(i).y)));
}
F++;
for(int i = qn, _cn = cn - 1; i--; ) {
while(_cn >= 0 && c(_cn).x >= q(i).x) {
Bit.Add(n - H(c(_cn).y), -c(_cn).x - c(_cn).y);
_cn--;
}
Min(ans[q[i]], -q(i).x - q(i).y - Bit.Query(n - H(q(i).y)));
}
}
 
void CDQ(int l, int r) {
if(l + 1 >= r)
return;
int m = (l + r) >> 1;
CDQ(l, m);
CDQ(m, r);
cn = qn = 0;
while(l < m) {
if(o[l].t == 1)
c[cn++] = l;
l++;
}
while(l < r) {
if(o[l].t == 2)
q[qn++] = l;
l++;
}
Work();
}
 
int main() {
Init();
CDQ(0, N);
for(int i = 0; i < N; i++) if(o[i].t == 2)
printf("%d\n", ans[i]);
return 0;
}

--------------------------------------------------------------

2716: [Violet 3]天使玩偶

Time Limit: 80 Sec  Memory Limit: 128 MB
Submit: 877  Solved: 384
[Submit][Status][Discuss]

Description

Input

Output

Sample Input

100 100
81 23
27 16
52 58
44 24
25 95
34 2
96 25
8 14
97 50
97 18
64 3
47 22
55 28
89 37
75 45
67 22
90 8
65 45
68 93
87 8
61 45
69 72
38 57
58 76
45 34
88 54
27 8
35 34
70 81
25 24
97 97
4 43
39 38
82 68
27 58
2 21
92 88
96 70
97 29
14 53
6 42
1 2
35 84
64 88
63 57
53 40
82 59
49 56
75 72
29 30
50 1
40 83
52 94
22 35
39 1
94 88
89 96
79 46
33 75
31 42
33 95
6 83
90 66
37 54
35 64
17 66
48 37
30 8
95 51
3 51
90 33
29 48
94 78
53 7
1 26
73 35
18 33
99 78
83 59
23 87
4 17
53 91
98 3
54 82
85 92
77 8
56 74
4 5
63 1
26 8
42 15
48 98
27 11
70 98
36 9
78 92
34 40
42 82
64 83
75 47
2 51 55
1 7 62
2 21 62
1 36 39
1 35 89
1 84 15
2 19 24
1 58 53
2 52 34
1 98 49
1 4 100
1 17 25
1 30 56
1 69 43
2 57 23
2 23 13
1 98 25
2 50 27
1 84 63
2 84 81
2 84 77
1 60 23
2 15 27
1 9 51
1 31 11
1 96 56
2 20 85
1 46 32
1 60 88
2 92 48
1 68 5
2 90 17
1 16 46
2 67 5
2 29 83
1 84 70
2 68 27
1 99 33
2 39 89
2 38 28
1 42 3
1 10 60
2 56 29
2 12 60
2 46 51
2 15 73
1 93 42
1 78 82
1 66 20
1 46 17
2 48 5
1 59 61
1 87 59
2 98 72
1 49 3
2 21 10
1 15 4
1 48 14
2 67 75
2 83 77
1 88 65
2 100 93
2 58 83
1 29 80
2 31 88
2 92 94
1 96 66
1 61 82
2 87 24
1 64 83
1 28 87
2 72 90
2 7 3
1 86 3
2 26 53
2 71 2
2 88 24
1 69 60
1 92 44
2 74 94
1 12 78
2 1 2
1 4 73
1 58 5
1 62 14
2 64 58
2 39 45
1 99 27
1 42 21
1 87 2
2 16 98
2 17 21
2 41 20
1 46 72
1 11 62
2 68 29
1 64 66
2 90 42
2 63 35
1 64 71

Sample Output

3
8
6
7
7
6
6
12
11
4
5
6
8
1
7
6
4
9
2
2
8
9
6
4
7
5
8
7
5
5
5
7
7
5
6
6
8
6
0
2
7
12
4
2
8
3
10

HINT

Source

BZOJ 2716: [Violet 3]天使玩偶( CDQ分治 + 树状数组 )的更多相关文章

  1. BZOJ 2716 [Violet 3]天使玩偶 (CDQ分治、树状数组)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2716 怎么KD树跑得都那么快啊..我写的CDQ分治被暴虐 做四遍CDQ分治,每次求一个 ...

  2. BZOJ 2716 Violet 3 天使玩偶 CDQ分治

    题目大意:初始给定平面上的一个点集.提供两种操作: 1.将一个点增加点集 2.查询距离一个点最小的曼哈顿距离 K-D树是啥...不会写... 我仅仅会CDQ分治 对于一个询问,查询的点与这个点的位置关 ...

  3. [BZOJ2716] [Violet 3]天使玩偶(CDQ分治)

    [BZOJ2716] [Violet 3]天使玩偶(CDQ分治) 题面 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里, ...

  4. BZOJ 1176 Mokia CDQ分治+树状数组

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

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

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

  6. 【BZOJ4553】[Tjoi2016&Heoi2016]序列 cdq分治+树状数组

    [BZOJ4553][Tjoi2016&Heoi2016]序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能 ...

  7. 【bzoj3262】陌上花开 CDQ分治+树状数组

    题目描述 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当且仅当Sa&g ...

  8. 【bzoj2225】[Spoj 2371]Another Longest Increasing CDQ分治+树状数组

    题目描述 给定N个数对(xi, yi),求最长上升子序列的长度.上升序列定义为{(xi, yi)}满足对i<j有xi<xj且yi<yj. 样例输入 8 1 3 3 2 1 1 4 5 ...

  9. LOJ3146 APIO2019路灯(cdq分治+树状数组)

    每个时刻都形成若干段满足段内任意两点可达.将其视为若干正方形.则查询相当于求历史上某点被正方形包含的时刻数量.并且注意到每个时刻只有O(1)个正方形出现或消失,那么求出每个矩形的出现时间和消失时间,就 ...

随机推荐

  1. o​r​a​l​c​e​ ​D​B​A​ ​培​训_lesson06

    控制文件 -小型二进制文件 -定义物理数据库的当前状态 -丢失控制文件须要修复 -维护数据库的完整性 -要求: 1.在启动数据库时处于mount状态 2.可以操作数据库 -仅仅链接至一个数据库 -最初 ...

  2. 用PS绿化版出现“请卸载并重新安装该产品”的解决方法

    下载了一个CS6版本的绿化版PS,解压后发现用不了,因为是不用安装的,所以这个提示明显是没用的. 我把64位破解文件 amtlib.dll和32位破解文件 amtlib.dll都放进去试了一下,结果行 ...

  3. 不能以方法的方式使用不可调用的“system.web.httprequest.querystring”

    问题描述:不能以方法的方式使用不可调用的“system.web.httprequest.querystring”解决办法:Request.QueryString["GoodsID" ...

  4. How to Use the UTL_MAIL Package

    APPLIES TO: PL/SQL - Version 10.1.0.2 and laterInformation in this document applies to any platform. ...

  5. C语言实现有序二叉树(1)

    在cpp中使用的C语言 头文件 /* 有序二叉树 BsTree */ #ifndef _BT_H #define _BT_H /*节点*/ typedef struct BsTreeNode { in ...

  6. Linux学习awk命令

    awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各 ...

  7. 重写javascript浮点运算

    javascript中变量存储时不区分number和float类型,同一按照float存储; javascript使用IEEE 754-2008标准定义的64bit浮点格式存储number,decim ...

  8. Android学习笔记27:网格视图GridView的使用

    网格视图GridView的排列方式与矩阵类似,当屏幕上有很多元素(文字.图片或其他元素)需要按矩阵格式进行显示时,就可以使用GridView控件来实现. 本文将以一个具体的实例来说明如何使用GridV ...

  9. Linux下安装QT和OpenGL后QT无法使用OpenGL的解决方法

    我的系统为Ubuntu14.04,用apt-get安装了实现了OpenGl的mesa,QT则是用官网下载的run文件来安装的. 好了,现在两个都分别有了,所以要在qt下尝试写OpenGl代码. 之前试 ...

  10. verilog中=和<=的区别

    一般情况下使用<=,组合逻辑使用=赋值,时序逻辑使用<=赋值: 举个例子:初始化m=1,n=2,p=3:分别执行以下语句 1.begin m=n:n=p:p=m: end 2.begin ...