先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. C# DataTable几个常用的查询表达式【转】

    DataTable dt = GetDetails().Tables[0]; //获取可用的DataTable            // var m = dt.AsEnumerable().Last ...

  2. 280行代码:Javascript 写的2048游戏

    2048 原作者就是用Js写的,一直想尝试,但久久未动手. 昨天教学生学习JS代码.最好还是就做个有趣的游戏好了.2048这么火,是一个不错的选择. 思路: 1. 数组 ,2维数组4x4 2. 移动算 ...

  3. Oracle 经常使用命令小结

    1.当前数据库中查看建表语句 select dbms_metadata.get_ddl('TABLE','表名') from dual; 2.当前数据库中查看视图创建Sql select text f ...

  4. SetEvent/ResetEvent

    在自己主动重置事件对象中,当WaitSingleObject/WaitForMultipleObjects接收到SetEvent发送过来的信号后则返回WAIT_OBJECT_0,此时操作系统(待定)自 ...

  5. UITabBarController 笔记(一)AppDelegate中加UITabBarController 为 rootViewController

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launc ...

  6. oracle&&Sqlserver获取表名列名主键及数据类型

    SQlserver获得列名,列类型,列类型长度,scale,prec等数据类型(syscolumns,systypes,sysobjects均为视图) select a.name as colname ...

  7. 6.828 lab1 bootload

    MIT6.828 lab1地址:http://pdos.csail.mit.edu/6.828/2014/labs/lab1/ 第一个练习,主要是让我们熟悉汇编,嗯,没什么好说的. Part 1: P ...

  8. Linux网络管理——子网掩码

    1. 网络基础 .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB",&q ...

  9. java反射获取注解并拼接sql语句

    先建两个注解 分别为 Table 和 Column package com.hk.test; import java.lang.annotation.ElementType; import java. ...

  10. 关于scala环境配置详解

    首先从官网下载适合自身电脑配置的scala安装包.scala下载官网网址:http://www.scala-lang.org/download/ 同时scala还有自己集成好的IDE,例如eclips ...