先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. break与continue

    1.break与continue.这两个关键字一般放在循环的花括号里面使用.break——结束整个循环.continue——结束本次循环,进入下次循环. break的案例: int i = 1; fo ...

  2. vue+webpack一些知识

    使用mac的用户需要获取权限才可以使用npm install指令 设置node目录的权限指令 sudo chmod -R 777 /usr/local/lib/node_modules/ 大家都知道国 ...

  3. iOS退出键盘的两种方式

    1,可以让叫出键盘的那个控件,退出第一响应者; 例如:textField叫出的键盘,那么就可以调用textField.resignFirstResponder,达到谁叫出的键盘谁退回去 2,可以让叫出 ...

  4. maven 引用自己的jar

    <build>    <plugins>        <plugin>            <groupId>org.apache.maven.pl ...

  5. hdu 4639 Hehe (dp)

    一道dp题,转移方程不是自己推出来的. 题目的意思是用‘qnmlgb’替换‘hehe’,可以替换也可以不替换,问有多少种情况. 如果结尾不是‘hehe’,那么dp[i]=dp[i-1],如果是是‘he ...

  6. stat 函数讲解

    表头文件:    #include <sys/stat.h>                     #include <unistd.h>定义函数:    int stat( ...

  7. Android存储小结

    转自:http://www.liaohuqiu.net/cn/posts/storage-in-android/ android系统自身自带有存储,另外也可以通过sd卡来扩充存储空间.前者好比pc中的 ...

  8. jquery学习(3)--高级选择器

    自己手写的学习笔记.常规选择器: /****************学习--高级选择器(1)****************/---高级选择器:ie7+ 层次选择器: 后代选择器     ul li ...

  9. JS获取浏览器窗口大小 获取屏幕,浏览器,网页高度宽度

    网页可见区域宽:document.body.clientWidth 网页可见区域高:document.body.clientHeight 网页可见区域宽:document.body.offsetWid ...

  10. EasyUI在MVC4中需要部分刷新页面时load()后页面变形问题!

    最近在使用MVC4与EasUI过程中遇到些容易导致界面变形的问题,纠结了很久,但其实当发现问题在哪里时,倒觉得最终还是自己对MVC4的概念没把握好,OK,show time.  本示例Contact ...