@(BZOJ)[CDQ分治]





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

Solution

4 * CDQ分治

細節不要寫錯

這份代碼是TLE的, 原因貌似是常數過大QAQ

假如讀者有在代碼中發現任何問題, 懇請告知, 筆者將感激不盡.

#include<cstdio>
#include<cctype>
#include<climits>
#include<cstring>
#include<algorithm>
using namespace std; inline int read()
{
int x = 0, flag = 1;
char c;
while(! isdigit(c = getchar()))
if(c == '-')
flag *= - 1;
while(isdigit(c))
x = x * 10 + c - '0', c = getchar();
return x * flag;
} void println(int x)
{
if(x < 0)
putchar('-'), x *= - 1;
if(x == 0)
putchar('0');
int ans[1 << 4], top = 0;
while(x)
ans[top ++] = x % 10, x /= 10;
for(; top; top --)
putchar(ans[top - 1] + '0');
putchar('\n');
} const int N = 1 << 19, M = 1 << 19;
const int LIM = 1 << 20; int n, m; struct vertex
{
int x, y, opt, ID, time; inline friend bool operator <= (vertex a, vertex b)
{
if(a.x == b.x)
return a.opt <= b.opt;
return a.x <= b.x;
}
}a[N + M], b[N + M], tmp[N + M]; int ans[M]; int T[LIM << 2]; void modify(int u, int L, int R, int p, int x)
{
if(L + 1 == R)
{
T[u] = x;
return;
} int mid = L + R >> 1; if(p < mid)
modify(u << 1, L, mid, p, x);
else
modify(u << 1 | 1, mid, R, p, x); T[u] = max(T[u << 1], T[u << 1 | 1]);
} int query(int u, int L, int R, int p)
{
if(p + 1 >= R)
return T[u]; int mid = L + R >> 1; if(p < mid)
return query(u << 1, L, mid, p);
else
return max(T[u << 1], query(u << 1 | 1, mid, R, p));
} void cdq(int L, int R)
{
if(L + 1 >= R)
return; int mid = L + R >> 1; cdq(L, mid), cdq(mid, R); for(int i = L; i < R; i ++)
tmp[i] = b[i]; int p1 = L, p2 = mid, p = L; while(p1 < mid && p2 < R)
{
if(b[p1] <= b[p2])
tmp[p ++] = b[p1 ++];
else
tmp[p ++] = b[p2 ++];
} while(p1 < mid)
tmp[p ++] = b[p1 ++]; while(p2 < R)
tmp[p ++] = b[p2 ++]; for(int i = L; i < R; i ++)
b[i] = tmp[i]; for(int i = L; i < R; i ++)
{
if(b[i].ID < mid && ! b[i].opt)
modify(1, 0, LIM, b[i].y, b[i].x + b[i].y);
else if(b[i].ID >= mid && b[i].opt)
{
int tmp = query(1, 0, LIM, b[i].y); //注意要特判 if(tmp)
ans[b[i].time] = min(ans[b[i].time], b[i].x + b[i].y - tmp);
}
} for(int i = L; i < R; i ++)
if(b[i].ID < mid && ! b[i].opt)
modify(1, 0, LIM, b[i].y, 0);
} void cdqSolve1()
{
for(int i = 0; i < n + m; i ++)
b[i] = a[i]; cdq(0, n + m);
} void cdqSolve2()
{
for(int i = 0; i < n + m; i ++)
b[i] = a[i], b[i].y = LIM - a[i].y; cdq(0, n + m);
} void cdqSolve3()
{
for(int i = 0; i < n + m; i ++)
b[i] = a[i], b[i].x = LIM - a[i].x, b[i].y = LIM - a[i].y; cdq(0, n + m);
} void cdqSolve4()
{
for(int i = 1; i <= n + m; i ++)
b[i] = a[i], b[i].x = LIM - a[i].x; cdq(0, n + m);
} int main()
{
#ifndef ONLINE_JUDGE
freopen("BZOJ2716.in", "r", stdin);
freopen("BZOJ2716.out", "w", stdout);
#endif n = read(), m = read(); for(int i = 0; i < n; i ++)
a[i].x = read() + 1, a[i].y = read() + 1, a[i].opt = 0, a[i].ID = i, a[i].time = - 1; for(int i = 0; i < m; i ++)
a[n + i].opt = read() - 1, a[n + i].x = read() + 1, a[n + i].y = read() + 1, a[n + i].ID = i + n, a[n + i].time = i; memset(ans, 127, sizeof(ans));
memset(T, 0, sizeof(T)); cdqSolve1(), cdqSolve2(), cdqSolve3(), cdqSolve4(); for(int i = 0; i < m; i ++)
if(a[i + n].opt)
println(ans[i]);
}

2716 [Violet 3] 天使玩偶的更多相关文章

  1. BZOJ 2716: [Violet 3]天使玩偶

    2716: [Violet 3]天使玩偶 Time Limit: 80 Sec  Memory Limit: 128 MBSubmit: 1473  Solved: 621[Submit][Statu ...

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

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

  3. bzoj 2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 --kdtree

    2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 Time Limit: 20 Sec  Memory Limit: 128 MB Description 这天,S ...

  4. BZOJ2648: SJY摆棋子&&2716: [Violet 3]天使玩偶

    BZOJ2648: SJY摆棋子 BZOJ2716: [Violet 3]天使玩偶 BZOJ氪金无极限... 其实这两道是同一题. 附上2648的题面: Description 这天,SJY显得无聊. ...

  5. 【BZOJ】2648: SJY摆棋子 & 2716: [Violet 3]天使玩偶(kdtree)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2716 http://www.lydsy.com/JudgeOnline/problem.php?id ...

  6. bzoj 2716 [Violet 3]天使玩偶——KDtree

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2716 第三道KDtree!仍旧是模板.还有CDQ分治做法,见下面. 数组迷之开大?(开6e5 ...

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

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

  8. BZOJ 2716 [Violet 3]天使玩偶 ——KD-Tree

    [题目分析] KD-Tree的例题.同BZOJ2648. [代码] #include <cstdio> #include <cstring> #include <cstd ...

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

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

随机推荐

  1. 基于IMD的包过滤防火墙原理与实现

    一.前言二.IMD中间层技术介绍三.passthru例程分析四.部分演示代码五.驱动编译与安装六. 总结 一.前言 前段时间,在安全焦点上看到了TOo2y朋友写的<基于SPI的数据报过滤原理与实 ...

  2. 使用Xcode连接开源中国

    故事背景: 今天加入一个新的项目组,其实也就是包括我在内就两个人,由于对方在开源中国上建的项目我没法使用. 所以由我接手第一个任务:就是在开源中国上搭建git项目组 前提条件:xcode和 Git(h ...

  3. Linux-实现双主模型的nginx的高可用

    实现双主模型的ngnix高可用(一) 准备:主机7台 client: 172.18.x.x 调度器:keepalived+nginx 带172.18.x.x/16 网卡 192.168.234.27 ...

  4. SqlServer 2014该日志未截断,因为其开始处的记录是挂起的复制操作或变更数据捕获

    环境:AlwaysOn集群 操作系统:Windows Server 2008 R2 数据库: SQL Server 2014 错误提示:“该日志未截断,因为其开始处的记录是挂起的复制操作或变更数据捕获 ...

  5. Django项目 生成依赖包

    生成依赖包文件 requirements.txt,最好用 pip3, 如果有 python2 的话会默认使用 py2 的 pip pip3 -r freeze > requirements.tx ...

  6. 双线性差值(由于分析sift源码 )

    双线性插值 双线性插值,顾名思义就是两个方向的线性插值加起来.所以只要了解什么是线性插值,分别在x轴和y轴都做一遍,就是双线性插值了. 线性插值的概念也非常简单粗暴,就是两个点A,B,要在AB中间插入 ...

  7. mysql主从复制延时判断+脚本检查

    在生产环境中,主从复制常常会有复制延迟的现象,主要是master是并发的写,而slave是单线程的应用relay log,所以会出现复制延时,在MySQL 5.6版本中有了基于库的多线程复制.还有Ma ...

  8. 【01】CSS规范

    [01]CSS规范 []https://drafts.csswg.org/indexes/(下图)   https://www.w3.org/TR/2011/REC-CSS2-20110607/   ...

  9. 编辑器sublime(转)摘自网络

    一.下载和安装 Sublime Text2是一款开源的软件,不需要注册即可使用(虽然没有注册会有弹窗,但是基本不影响使用). 下载地址:http://www.sublimetext.com/,请自行根 ...

  10. .NET重构(八):周结账单中,给报表添加参数

    导读:进行完了日结报表的制作,大松一口气.不过,刚开始看着周结账单中的两个参数问题,也是愁了很久.不过,只要思想不滑坡,办法总比困难多.接下来,就写写我制作周结账单报表的过程. 一.添加参数 1,在日 ...