题目:

Description

Input

Output

HINT

题解:

学了cdq后近期最后一道题···然而tm还是搞了1个半小时才tm搞出来······

先说思路:对于绝对值,我们采取类似于旋转整个图的方法,也就是说共计三次翻转再加上原来的图,每次旋转90度,算出点在旋转后的对应坐标(具体看代码中的注释部分),然后对于一个询问,每次只算它左上角的点的贡献,这样就有一个三维偏序:<时间,x,y>,时间已经在开始就默认排好了,由于此时dis=x-x1+y-y1=x+y-x1-y1,所以对于一个<时间,x,y>,我们要计算的是所有x1<x,y1<y,时间1<时间的点中x1+y1最大的点,这样dis就能最小;分析完基本思路后,接下来就是cdq的基本套路了,x1+y1用树状数组维护

但这道题让我发现了自己的许多细节错误,详细见代码注释

代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cmath>
  5. #include<ctime>
  6. #include<cctype>
  7. #include<cstring>
  8. #include<string>
  9. #include<algorithm>
  10. using namespace std;
  11. const int N=2e6+;
  12. const int M=5e5+;
  13. struct node
  14. {
  15. int x,y,id,pos;
  16. }a[N],q[N],tmp[N];
  17. int n,m,tot,maxx,maxy,ans[M],cnt=,tree[N],tag[N],tim;
  18. inline int R()
  19. {
  20. char c;int f=;
  21. for(c=getchar();c<''||c>'';c=getchar());
  22. for(;c<=''&&c>='';c=getchar())
  23. f=(f<<)+(f<<)+c-'';
  24. return f;
  25. }
  26. bool comp(node a,node b)
  27. {
  28. if(a.x==b.x) return a.id<b.id; //!!!!!注意一定要有这一点,x相同时一定要按时间排序!!
  29. else return a.x<b.x;
  30. }
  31. inline void insert(int u,int v)
  32. {
  33. for(int i=u;i<=maxy;i+=(i&(-i)))
  34. if(tag[i]!=tim) tag[i]=tim,tree[i]=v;
  35. else tree[i]=max(tree[i],v);
  36. }
  37. inline int query(int u)
  38. {
  39. int temp=;
  40. for(int i=u;i;i-=(i&(-i)))
  41. if(tag[i]!=tim) continue;
  42. else temp=max(temp,tree[i]);
  43. return temp==?-1e+:temp; //注意这里!!!
  44. }
  45. inline void solve(int l,int r)
  46. {
  47. if(l==r) return;
  48. int mid=(l+r)/;
  49. solve(l,mid),solve(mid+,r);
  50. int i=l,j=mid+,k=l;tim++;
  51. while(i<=mid&&j<=r)
  52. {
  53. if(comp(q[i],q[j]))
  54. {
  55. if(!q[i].pos) insert(q[i].y,q[i].x+q[i].y);
  56. tmp[k++]=q[i++];
  57. }
  58. else
  59. {
  60. if(q[j].pos) ans[q[j].pos]=min(ans[q[j].pos],q[j].x+q[j].y-query(q[j].y));
  61. tmp[k++]=q[j++];
  62. }
  63. }
  64. while(i<=mid) tmp[k++]=q[i++];
  65. while(j<=r)
  66. {
  67. if(q[j].pos) ans[q[j].pos]=min(ans[q[j].pos],q[j].x+q[j].y-query(q[j].y));
  68. tmp[k++]=q[j++];
  69. }
  70. for(j=l;j<=r;j++) q[j]=tmp[j];
  71. }
  72. int main()
  73. {
  74. //freopen("a.in","r",stdin);
  75. n=R();m=R();int x,y,t;
  76. for(int i=;i<=n;i++)
  77. {
  78. x=R()+,y=R()+;
  79. a[++tot].id=i,a[tot].x=x,a[tot].y=y;
  80. maxx=max(maxx,x),maxy=max(maxy,y);
  81. }
  82. for(int i=;i<=m;i++)
  83. {
  84. t=R(),x=R()+,y=R()+;
  85. if(t==)
  86. a[++tot].id=tot,a[tot].x=x,a[tot].y=y;
  87. else
  88. a[++tot].id=tot,a[tot].x=x,a[tot].y=y,a[tot].pos=++cnt;
  89. maxx=max(maxx,x),maxy=max(maxy,y);
  90. }
  91. maxx++,maxy++;
  92. for(int i=;i<=cnt;i++) ans[i]=1e+;
  93. for(int i=;i<=tot;i++) q[i]=a[i]; //第一次,不用翻转
  94. solve(,tot);
  95. for(int i=;i<=tot;i++) q[i]=a[i],q[i].x=maxx-a[i].x; //第一次翻转 (不一定是90度,把所有情况讨论了就行)
  96. solve(,tot);
  97. for(int i=;i<=tot;i++) q[i]=a[i],q[i].y=maxy-a[i].y; //第二次翻转
  98. solve(,tot);
  99. for(int i=;i<=tot;i++) q[i]=a[i],q[i].x=maxx-a[i].x,q[i].y=maxy-a[i].y; //第三次翻转
  100. solve(,tot);
  101. for(int i=;i<=cnt;i++) printf("%d\n",ans[i]);
  102. return ;
  103. }

刷题总结——天使玩偶(bzoj2716)的更多相关文章

  1. [BZOJ2716]天使玩偶

    [BZOJ2716]天使玩偶 题目大意: 一个平面直角坐标系,坐标\(1\le x,y\le10^6\).\(n(n\le10^6)\)次操作,操作包含以下两种: 新增一个点\((x,y)\): 询问 ...

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

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

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

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

  4. bzoj2716/2648 / P4169 [Violet]天使玩偶/SJY摆棋子

    P4169 [Violet]天使玩偶/SJY摆棋子 k-d tree 模板 找了好几天才发现输出优化错了....真是zz...... 当子树非常不平衡时,就用替罪羊树的思想,拍扁重建. luogu有个 ...

  5. NOIp2018停课刷题记录

    Preface 老叶说了高中停课但是初中不停的消息后我就为争取民主献出一份力量 其实就是和老师申请了下让我们HW的三个人听课结果真停了 那么还是珍惜这次机会好好提升下自己吧不然就\(AFO\)了 Li ...

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

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

  7. 【BZOJ-2648&2716】SJY摆棋子&天使玩偶 KD Tree

    2648: SJY摆棋子 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2459  Solved: 834[Submit][Status][Discu ...

  8. CH4701 天使玩偶

    题意 4701 天使玩偶 0x40「数据结构进阶」例题 描述 题目PDF 样例输入 2 3 1 1 2 3 2 1 2 1 3 3 2 4 2 样例输出 1 2 来源 石家庄二中Violet 3杯省选 ...

  9. SJY摆棋子&&[Violet 3]天使玩偶

    SJY摆棋子 https://www.lydsy.com/JudgeOnline/problem.php?id=2648 [Violet 3]天使玩偶 https://www.lydsy.com/Ju ...

随机推荐

  1. UVA 12901 Refraction 折射 (物理)

    一道物理题,解个2次方程就行了... 求h最小的情况对应如下图所示 做法不唯一,我想避免精度损失所以在化简的时候尽可能地去避免sqrt和浮点数乘除. 似乎精度要求很低,直接用角度算也可以 #inclu ...

  2. python-下拉框

    首先,从selenium.webdriver.support.ui里调用Select类,如下: 其次,找到下拉框元素,再找下拉框里要最终选择的元素,如下: 注意:调用Select类后,不必再加clic ...

  3. mina架构在JT/T808协议应用程序中的应用

    Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP.UDP/IP协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务.虚拟机管道通信服务等),M ...

  4. c内置数据类型

    参考 C与指针 第三章 类型 类型标识符 字节 表示数值范围 备注 整型 [signed] int 2* -32768~32767 -2^15 ~ (2^15 -1) 无符号整型 unsigned [ ...

  5. poj1265 Area

    题目描述: vjudge POJ 由于题目乱码概括一下题意: 给出一个路径,求围成多边形中内部点数.边上点数(包括顶点)以及面积. 题解: 边上点数=$\sum gcd(dx,dy)$ $Pick$定 ...

  6. LeetCode之Weekly Contest 90

    LeetCode第90场周赛记录 第一题:亲密字符串 问题: 给定两个由小写字母构成的字符串 A 和 B ,只要我们可以通过交换 A 中的两个字母得到与 B 相等的结果,就返回 true :否则返回  ...

  7. poj-1700 crossing river(贪心题)

    题目描述: A group of N people wishes to go across a river with only one boat, which can at most carry tw ...

  8. IIS发布网站Microsoft JET Database Engine 错误 '80004005'的解决办法,基于Access数据库

    在网站发布后,访问网站会有80004005的错误提示. 项目环境 项目基于Access数据库,server2012,文件系统为NTFS格式. 错误信息 Microsoft JETDatabase En ...

  9. markdown快捷键

    分组 功能 操作 快捷键 设置标题 一级标题 Heading1 Ctrl+1 二级标题 Heading2 Ctrl+2 三级标题 Heading3 Ctrl+3 四级标题 Heading4 Ctrl+ ...

  10. Java技术——Java泛型详解

    .为什么需要泛型 转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52230032 泛型在Java中有很重要的地位,网上很多文章罗列各种 ...