【题解】P2521 [HAOI2011]防线修建(动态凸包)

凸包是易插入不好删除的东西,按照剧情所以我们时光倒流

然后问题就是维护凸包的周长,支持加入

本来很简单,但是计算几何就是一些小地方经验不足容易WA和RE

然后代码注释里有一些经验

  1. //@winlere
  2. #include<iostream>
  3. #include<set>
  4. #include<cstdio>
  5. #include<cstring>
  6. #include<algorithm>
  7. #include<vector>
  8. #include<cmath>
  9. #define pf(x) ((x)*(x))
  10. #define DEBUG(s,a) cerr<<#s" = "<<(s)<<" \n"[(a)==1]
  11. #define getchar() (__c==__ed?(__ed=__buf+fread(__c=__buf,1,1<<18,stdin),*__c++):*__c++)
  12. using namespace std; typedef long long ll; char __buf[1<<18],*__c=__buf,*__ed=__buf;
  13. inline int qr(){
  14. int ret=0,f=0,c=getchar();
  15. while(!isdigit(c))f|=c==45,c=getchar();
  16. while(isdigit(c)) ret=ret*10+c-48,c=getchar();
  17. return f?-ret:ret;
  18. }
  19. const int maxn=1e5+5;
  20. struct NODE{//向量 坐标用一个结构体代替就行了
  21. ll x,y;//用ll吧 别小气
  22. NODE operator - (NODE b)const{return {x-b.x,y-b.y};}
  23. ll operator % (NODE b)const{return x*b.y-y*b.x;}
  24. bool operator < (NODE b)const{return x<b.x;}
  25. double operator ^ (NODE b)const{return sqrt(pf(x-b.x)+pf(y-b.y));}
  26. }data[maxn],capt;
  27. vector< pair<int,int> > ve;
  28. double len,ans[maxn];
  29. bool in[maxn];
  30. set<NODE> s;
  31. void insert(NODE x){
  32. vector<NODE> ve;
  33. if((*s.upper_bound(x)-x)%(x-*--s.upper_bound(x))<0) return;//先判断是否能够插入,这样以后好写一些
  34. for(set<NODE>::iterator t=--s.upper_bound(x),temp;t!=s.begin();t=temp){
  35. temp=prev(t);
  36. if((x-*temp)%(*t-*temp)<0) ve.push_back(*t);//避免一边用iterator一边erase
  37. else break;
  38. }
  39. reverse(ve.begin(),ve.end());
  40. for(set<NODE>::iterator t=s.upper_bound(x),temp;t!=--s.end();t=temp){
  41. temp=next(t);
  42. if((*temp-x)%(*temp-*t)>0) ve.push_back(*t);//同上
  43. else break;
  44. }
  45. if(ve.size()==0)//多写几个if比仔细比巧妙统一快得多,对于=0,=1都特判一下,这里只要=0特判
  46. len+=(*s.upper_bound(x)^x)+(*--s.upper_bound(x)^x)-(*--s.upper_bound(x)^*s.upper_bound(x));
  47. else {
  48. auto l=*--s.find(ve.front()),r=*++s.find(ve.back());
  49. len+=(l^x)+(r^x)-(l^ve.front())-(r^ve.back());
  50. for(int t=1,ed=ve.size();t<ed;++t) len-=ve[t]^ve[t-1];//多写一个循环没问题
  51. for(auto t:ve) s.erase(t);
  52. }
  53. s.insert(x);
  54. }
  55. int n,m,x,y,q;
  56. int main(){
  57. n=qr(); capt.x=qr(),capt.y=qr(); m=qr();
  58. s.insert(capt); s.insert({n,0}); s.insert({0,0}); len=(capt^*s.begin())+(capt^*s.rbegin());
  59. for(int t=1;t<=m;++t) data[t].x=qr(),data[t].y=qr();
  60. q=qr();
  61. for(int t=1;t<=q;++t){
  62. int op=qr();
  63. ve.push_back(op==1?(pair<int,int>){op,qr()}:(pair<int,int>){op,t});
  64. if(op==1) in[ve.back().second]=1;
  65. }
  66. for(int t=1;t<=m;++t)
  67. if(!in[t])
  68. insert(data[t]);
  69. reverse(ve.begin(),ve.end());
  70. for(auto t:ve)
  71. if(t.first==1) insert(data[t.second]);
  72. else ans[t.second]=len;
  73. reverse(ve.begin(),ve.end());
  74. for(auto t:ve)
  75. if(t.first==2) printf("%.2lf\n",ans[t.second]);
  76. return 0;
  77. }

【题解】P2521 [HAOI2011]防线修建(动态凸包)的更多相关文章

  1. BZOJ 2300: [HAOI2011]防线修建( 动态凸包 )

    离线然后倒着做就变成了支持加点的动态凸包...用平衡树维护上凸壳...时间复杂度O(NlogN) --------------------------------------------------- ...

  2. 【bzoj2300】【Luogu P2521】 [HAOI2011]防线修建 动态凸包,平衡树,Set

    一句话题意:给你一个凸包,每次可以插入一个点或者询问周长. 动态凸包裸题嘛,用\(Set\)实现.最初每个点坐标做乘三处理,便于取初始三角形的重心作为凸包判定原点. #include <bits ...

  3. [luogu P2521] [HAOI2011]防线修建

    [luogu P2521] [HAOI2011]防线修建 题目描述 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国 ...

  4. P2521 [HAOI2011]防线修建

    题目链接:P2521 [HAOI2011]防线修建 题意:给定点集 每次有两种操作: 1. 删除一个点 (除开(0, 0), (n, 0), 与指定首都(x, y)) 2. 询问上凸包长度 至于为什么 ...

  5. Bzoj2300 / 洛谷P2521 [HAOI2011]防线修建

    题目描述 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上层现在还犹豫不决,到底该把哪些城市作为保护对象呢?又由于 ...

  6. 【BZOJ 2300】 2300: [HAOI2011]防线修建 (动态凸包+set)

    2300: [HAOI2011]防线修建 Description 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上 ...

  7. 【BZOJ2300】[HAOI2011]防线修建 set维护凸包

    [BZOJ2300][HAOI2011]防线修建 Description 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可 ...

  8. bzoj千题计划236:bzoj2300: [HAOI2011]防线修建

    http://www.lydsy.com/JudgeOnline/problem.php?id=2300 维护动态凸包,人懒用的set 用叉积判断,不要用斜率 #include<set> ...

  9. BZOJ [HAOI2011]防线修建(动态凸包)

    听说有一种很高端的东西叫动态凸包维护dp就像学一下,不过介于本人还不会动态凸包就去学了下,还是挺神奇的说,维护上下凸包的写法虽然打得有点多不过也只是维护复制黏贴的事情而已罢了. 先说下动态凸包怎么写吧 ...

随机推荐

  1. Java练习 SDUT-2585_机器人II

    机器人II Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 自从xiao_wu发明了只能向左转与向右转的机器人以后,热血 ...

  2. @codeforces - 1209H@ Moving Walkways

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 机场中常常见到滑行道:假如一个滑行道的运行速度为 s,你的行走速 ...

  3. js+canvas 一只一担小游戏

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. day2_python之字符编码

    一 .计算机基础知识 二.文本编辑器存取文件的原理(nodepad++,pycharm,word) #1.打开编辑器就打开了启动了一个进程,是在内存中的,所以,用编辑器编写的内容也都是存放与内存中的, ...

  5. element-ui css 文件加载 失败(https://unpkg.com/element-ui/lib/theme-chalk/index.css,加载失败)

    在main.js文件引入   import Vue from 'vue'; import Element from 'element-ui'; import 'element-ui/lib/theme ...

  6. mysql多表连接和子查询

    文章实例的数据表,来自上一篇博客<mysql简单查询>:http://blog.csdn.net/zuiwuyuan/article/details/39349611 MYSQL的多表连接 ...

  7. HDU 1114 完全背包问题

    题意:有一个存钱罐,空罐时的重量是e,满罐时的重量是f,现在有n种硬币,每一种有无限个,现在给出每一种硬币的价值p和重量w,问存钱罐中最少钱,输出最小钱,否则输出... 思路:变形的完全背包问题,只是 ...

  8. 2005年NOIP普及组复赛题解

    题目涉及算法: 陶陶摘苹果:入门题: 校门外的树:简单模拟: 采药:01背包: 循环:模拟.高精度. 陶陶摘苹果 题目链接:https://www.luogu.org/problem/P1046 循环 ...

  9. 2019-9-2-本文说如何显示SVG

    title author date CreateTime categories 本文说如何显示SVG lindexi 2019-09-02 12:57:38 +0800 2018-2-13 17:23 ...

  10. Koa2 遇到Method Not Allowed 获取不到返回值

    https://q.cnblogs.com/q/114462/          都来找我  Haisen‘s blogs 求求各位大神了,2点多了没解决睡不着啊,我按照网上用的koa2-cors,g ...