先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. Android 主线程和线程之间相互发送消息

    通过分析Activity源码,我们知道每个Activity都有一个Looper,所以主线程在接收Message是不需要调用Looper.prepare()和Looper.loop(),但是线程是不带L ...

  2. 黑马程序员_高新技术之javaBean,注解,类加载器

    ----------- android培训.java培训.java学习型技术博客.期待与您交流! ---------- 第一部分 javaBean 一,由内省引出javaBean 1,内省: 内省对应 ...

  3. LA - 5031 - Graph and Queries

    题意:一个N个点(编号从1开始),M条边的无向图(编号从1开始),有3种操作: D X:把编号为X的边删了: Q X K:查询编号为X的结点所在连通分量第K大的元素: C X V:将编号为X的结点的权 ...

  4. Linux 下编译Android-VLC开源播放器详解(附源码下载)

    这两天需要做音视频播放相关的东西,所以重新找了目前android下的解码库.Android自带的解码库支持不全,因此很多第三方播放器都是自带解码器,绝大部分都是使用FFMpeg作为解码库.我11年的时 ...

  5. easyui的样式easyui-textbox的一个bug

    easyui-testbox这个样式很恶心,用了这个就不能用传统的JQ来取值了,最近在使用上又发现了一个问题,就是赋值为0时,在输入框上会不显示,坑. <input class="ea ...

  6. 排序算法 -- 数据结构与算法的javascript描述 第12章

    排序是常见的功能,给定一组数据,对其进行排序. 在此之前,我们需要准备个基础工作--自动生成数组,并可以对该组数据做任何处理. /** * 测试类 ,数组 * @param numElements * ...

  7. JavaScript 中的面向对象的初步认识

    我在学习JS的面向对象编程的时候,总是有两个奇怪的问题. 第一个就是:面向对象在JS中很少用到... 可能是目前自己做的项目还是比较简单,前端方面的任务我几乎都是用面向过程的方式写的,所以就导致,我啃 ...

  8. sql server存储过程分页

    Create PROCEDURE [dbo].[Table_GetList] ) = '', -- 查询条件(注意: 不要加 WHERE) ) = '', -- 设置排序 , -- 页尺寸 , -- ...

  9. MAVEN入门(一)

    一.Maven的基本概念 Maven是跨平台的项目管理工具.主要服务于基于Java平台的项目构建,依赖管理和项目信息管理. 1.1.项目构建 项目构建过程包括[清理项目]→[编译项目]→[测试项目]→ ...

  10. ecmall 点滴记录

    /* 取得列表数据 */ $model_wish =& m('wish'); $wish= $model_wish->find(array( 'conditions' => 'us ...