题目

输入格式

输出格式

输入样例

//样例太长就不贴了。。。。

输出样例

//见原题

提示

题解

我们将曼哈顿距离式子中的绝对值去掉,每次只考虑x,y比当前点小的更新答案。

为了使所有点都对答案进行更新,将坐标轴旋转三次再算三次

每一次对于点(x,y),找到(x’,y’)【x’<=x,y’<= y且 时间t’ < t】使得x+y−(x′+y′)最小

类似三维偏序的东西,可以用CDQ分治

树状数组维护最大值

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define LL long long int
  6. #define REP(i,n) for (int i = 1; i <= (n); i++)
  7. #define lbt(x) (x & -x)
  8. using namespace std;
  9. const int maxn = 1000005,maxm = 2010005,INF = 0x7fffffff;
  10. inline int RD(){
  11. int out = 0,flag = 1; char c = getchar();
  12. while (c < 48 || c > 57) {if (c == '-') flag = -1; c = getchar();}
  13. while (c >= 48 && c <= 57) {out = (out << 1) + (out << 3) + c - '0'; c = getchar();}
  14. return out * flag;
  15. }
  16. int ans[maxn],n,m,N = 0,ansi = 0,Qi = 0,S[maxm];
  17. struct Que{int x,y,t,id;}Q[maxn],T[maxn];
  18. inline bool operator <(const Que& a,const Que& b){
  19. if (a.x == b.x && a.y == b.y) return a.t < b.t;
  20. if (a.x == b.x) return a.y < b.y;
  21. return a.x < b.x;
  22. }
  23. void add(int u,int v){while (u <= N) S[u] = max(S[u],v),u += lbt(u);}
  24. int query(int u){int an = 0; while (u) an = max(an,S[u]),u -= lbt(u); return an;}
  25. void cls(int u){while (u <= N) S[u] = 0,u += lbt(u);}
  26. void CDQ(int l,int r){
  27. if (l == r) return;
  28. int mid = l + r >> 1,l1 = l,l2 = mid + 1,temp;
  29. for (int i = l; i <= r; i++){
  30. if (Q[i].t <= mid && !Q[i].id)
  31. add(Q[i].y,Q[i].x + Q[i].y);
  32. else if (Q[i].t > mid && Q[i].id){
  33. temp = query(Q[i].y);
  34. if (temp) ans[Q[i].id] = min(ans[Q[i].id],Q[i].x + Q[i].y - temp);
  35. }
  36. }
  37. for (int i = l; i <= r; i++){
  38. if (Q[i].t <= mid){
  39. T[l1++] = Q[i];
  40. if (!Q[i].id) cls(Q[i].y);
  41. }else T[l2++] = Q[i];
  42. }
  43. for (int i = l; i <= r; i++) Q[i] = T[i];
  44. CDQ(l,mid); CDQ(mid + 1,r);
  45. }
  46. int main(){
  47. //freopen("in.txt","r",stdin);
  48. //freopen("out1.txt","w",stdout);
  49. n = RD();m = RD(); Qi = n + m; int opt;
  50. REP(i,n){
  51. Q[i].x = RD() + 1,Q[i].y = RD() + 1,Q[i].t = i,Q[i].id = 0;
  52. N = max(N,Q[i].x); N = max(N,Q[i].y);
  53. }
  54. for (int i = n + 1; i <= Qi; i++){
  55. opt = RD(); Q[i].x = RD() + 1; Q[i].y = RD() + 1,Q[i].t = i;
  56. N = max(N,Q[i].x); N = max(N,Q[i].y);
  57. if (opt & 1) Q[i].id = 0;
  58. else Q[i].id = ++ansi;
  59. }N++;
  60. fill(ans,ans + maxn,INF);
  61. sort(Q + 1,Q + 1 + Qi); CDQ(1,Qi);
  62. REP(i,Qi) Q[i].x = N - Q[i].x;
  63. sort(Q + 1,Q + 1 + Qi); CDQ(1,Qi);
  64. REP(i,Qi) Q[i].y = N - Q[i].y;
  65. sort(Q + 1,Q + 1 + Qi); CDQ(1,Qi);
  66. REP(i,Qi) Q[i].x = N - Q[i].x;
  67. sort(Q + 1,Q + 1 + Qi); CDQ(1,Qi);
  68. REP(i,ansi) printf("%d\n",ans[i]);
  69. return 0;
  70. }

BZOJ2716 [Violet 3]天使玩偶 【CDQ分治】的更多相关文章

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

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

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

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

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

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

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

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

  5. bzoj2648SJY摆棋子&&bzoj2716[Violet 3]天使玩偶*

    bzoj2648SJY摆棋子 bzoj2716[Violet 3]天使玩偶 题意: 棋盘上有n个棋子,现在有m个操作,一种是加棋子,一种是查询离某个点最近的棋子.n,m≤500000. 题解: 先将已 ...

  6. [bzoj] 2716 天使玩偶 || CDQ分治

    原题 已知n个点有天使玩偶,有m次操作: 操作1:想起来某个位置有一个天使玩偶 操作2:询问离当前点最近的天使玩偶的曼哈顿距离 显然的CDQ问题,三维分别为时间,x轴,y轴. 但是这道题的问题在于最近 ...

  7. bzoj2716: [Violet 3]天使玩偶

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  8. 洛谷P4169 天使玩偶 CDQ分治

    还是照着CDQ的思路来. 但是有一些改动: 要求4个方向的,但是可爱的CDQ分治只能求在自己一个角落方向上的.怎么办?旋转!做4次就好了. 统计的不是和,而是——max!理由如下: 设当前点是(x,y ...

  9. CH 4701 - 天使玩偶 - [CDQ分治]

    题目链接:传送门 关于CDQ分治(参考李煜东<算法竞赛进阶指南>): 对于一系列操作,其中的任何一个询问操作,其结果必然等价于:初始值 + 此前所有的修改操作产生的影响. 假设共有 $m$ ...

随机推荐

  1. poj_1320_Street Numbers

    A computer programmer lives in a street with houses numbered consecutively (from 1) down one side of ...

  2. zeppelin ERROR总结

    ERROR [2017-03-23 20:01:50,799] ({qtp331657670-221} NotebookServer.java[onMessage]:221) - Can't hand ...

  3. 状压DP详解(位运算)

    前言: 状压DP是一种非常暴力的做法(有一些可以排除某些状态的除外),例如dp[S][v]中,S可以代表已经访问过的顶点的集合,v可以代表当前所在的顶点为v.S代表的就是一种状态(二进制表示),比如 ...

  4. Codeforces Round #392 (Div. 2) Unfair Poll

    C. Unfair Poll time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  5. 用python实现【五猴分桃】问题

    转载链接:https://blog.csdn.net/cy309173854/article/details/78296839 据说“五猴分桃”问题最先是由大物理学家狄拉克提出来的,这一貌似简单的问题 ...

  6. vue 组件间数据传递

    父组件向子组件传值 方法一: 子组件想要使用父组件的数据,需要通过子组件的 props 选项来获得父组件传过来的数据. 1.父组件parent.vue中代码: <template> < ...

  7. url_maneger.py

    coding=UTF-8 # url管理器 class urlManeger: def __init__(self): self.new_urls = set() self.old_urls = se ...

  8. Python os.walk() 简介

    Table of Contents 1. os.walk目录遍历 1.1. os.walk 1.2. 例子 1.2.1. 测试topdown 1.2.2. 运行时修改遍历目录 2. 参考资料 os.w ...

  9. netty学习记录1

    最近在学习netty,看的是<netty权威指南 第2版>. 然后看的同时也把书上面的代码一行行敲下来做练习,不过到第三章就出问题了. 按照书上讲的,sever/client端都需要继承C ...

  10. zedboard烧写SD卡启动linux镜像

    1. 先把SD卡格式化,然后把镜像文件拷贝到SD卡,下面应该是没有文件系统的 2. 插上SD卡,Zedboard设置启动模式,有5个跳线帽,配置如下,上电启动 3. 看下串口的输出