【BZOJ2300】【HAOI2011】防线修建
题目大意:给你m+3个点,有q个操作,每次要么询问当前点集构所构成的上凸壳总长度,要么在当前点集中删除一个点。
这题是吼题啊!!!
刚开始想着如何正常地做,考虑过用线段树维护一个区间内的凸包,发现并不行,要另请高明。
后来发现,这题并没有强制在线要求,我们不妨将所有的询问反过来处理。首先将从头到尾都没有被删除的点加入该凸包,然后将询问倒序处理,将原先的删点操作改为加点操作,随后动态维护该凸包并维护上凸壳总长度,需输出的答案压入一个栈中,最后逐个弹出输出即可。
至于如何动态维护凸包。本题有一个很特殊的条件:所有点坐标的x,y值均大于0,且必有一个点坐标为(0,0)。故我们可以用一个set维护当前在凸包上的点,当需要加入一个点k时,借助lower_bound找到与该点相邻夹角的两个点,直接进行维护即可。实现细节较为复杂,强烈建议先工整地将维护方法写在草稿纸上!!
PS:这次发现set容器的iterator有一些神奇的性质,假定有一个迭代器指针it,其后继为it1,在it未更新时,若有一个元素插入在it和it1之间,那么it1仍将认为其后继为it1而非新插入的元素,需要用某些方法更新下it(没有1a的元凶)
#include<bits/stdc++.h>
#define M 210000
using namespace std;
struct node{
int x,y; node(){x=y=;}
node(int xx,int yy){x=xx; y=yy;}
friend node operator -(node a,node b){return node(a.x-b.x,a.y-b.y);}
friend int operator *(node a,node b){
return a.y*b.x-a.x*b.y;
}
friend bool operator <(node a,node b){
if(a.x==&&a.y==) return ;
if(b.x==&&b.y==) return ;
if(a.x*b.y==a.y*b.x) return a.x<b.x;
return a.y*b.x<a.x*b.y;
}
}a[M];
set<node> s; int n,x,y,m,op[M]={},id[M]={}; bool vis[M]={};
int cj(node a,node b,node c){return (b-a)*(c-a);}
double dis(node a,node b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}
double ans=; void ins(node k){
set<node>::iterator now,nowm,nown,pre;
nown=nowm=now=s.upper_bound(k);
now--; nowm--; nowm--;
while(cj(*nowm,*now,k)>){
ans=ans-dis(*nown,*now)-dis(*now,*nowm)+dis(*nown,*nowm);
pre=now; *now--;
s.erase(pre);
if(nowm==s.begin()) break;
*nowm--;
}
if(cj(*now,k,*nown)>) return;
ans=ans-dis(*nown,*now)+dis(*nown,k)+dis(*now,k);
s.insert(k);
nowm=now=nown=s.find(k);
now++; nown++; nown++;
while(cj(*nowm,*now,*nown)>&&nown!=s.end()){
ans=ans-dis(*nown,*now)-dis(*now,*nowm)+dis(*nown,*nowm);
pre=now; *now++; *nown++;
s.erase(pre);
}
}
double ansp[M]={};int use=;
int main(){
scanf("%d%d%d",&n,&x,&y);
s.insert(node(,)); s.insert(node(n,)); s.insert(node(x,y));
ans=dis(node(,),node(x,y))+dis(node(x,y),node(n,));
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y);
scanf("%d",&m);
for(int i=;i<=m;i++){
scanf("%d",op+i);
if(op[i]==) continue;
scanf("%d",id+i);
vis[id[i]]=;
}
for(int i=;i<=n;i++) if(!vis[i]) ins(a[i]);
for(int i=m;i;i--){
if(op[i]==) {ansp[++use]=ans; continue;}
if(!vis[id[i]]) continue;
ins(a[id[i]]); vis[id[i]]=;
}
while(use) printf("%.2lf\n",ansp[use--]);
}
【BZOJ2300】【HAOI2011】防线修建的更多相关文章
- bzoj千题计划236:bzoj2300: [HAOI2011]防线修建
http://www.lydsy.com/JudgeOnline/problem.php?id=2300 维护动态凸包,人懒用的set 用叉积判断,不要用斜率 #include<set> ...
- BZOJ2300[HAOI2011]防线修建——非旋转treap+凸包(平衡树动态维护凸包)
题目描述 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上层现在还犹豫不决,到底该把哪些城市作为保护对象呢?又由于 ...
- BZOJ2300: [HAOI2011]防线修建
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2300 (我只是在发以前写过的题.. 因为题目没说强制在线,所以离线乱搞就可以了.先把点删掉然后 ...
- 2019.02.21 bzoj2300: [HAOI2011]防线修建(set+凸包)
传送门 题意:动态维护凸包周长. 思路: 见这篇求面积的吧反正都是一个套路. 代码: #include<bits/stdc++.h> #define int long long #defi ...
- 【BZOJ2300】[HAOI2011]防线修建 set维护凸包
[BZOJ2300][HAOI2011]防线修建 Description 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可 ...
- 【BZOJ 2300】 2300: [HAOI2011]防线修建 (动态凸包+set)
2300: [HAOI2011]防线修建 Description 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上 ...
- BZOJ 2300: [HAOI2011]防线修建( 动态凸包 )
离线然后倒着做就变成了支持加点的动态凸包...用平衡树维护上凸壳...时间复杂度O(NlogN) --------------------------------------------------- ...
- [luogu P2521] [HAOI2011]防线修建
[luogu P2521] [HAOI2011]防线修建 题目描述 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国 ...
- P2521 [HAOI2011]防线修建
题目链接:P2521 [HAOI2011]防线修建 题意:给定点集 每次有两种操作: 1. 删除一个点 (除开(0, 0), (n, 0), 与指定首都(x, y)) 2. 询问上凸包长度 至于为什么 ...
- 【题解】P2521 [HAOI2011]防线修建(动态凸包)
[题解]P2521 [HAOI2011]防线修建(动态凸包) 凸包是易插入不好删除的东西,按照剧情所以我们时光倒流 然后问题就是维护凸包的周长,支持加入 本来很简单,但是计算几何就是一些小地方经验不足 ...
随机推荐
- 【commons-httpclient】Java中HttpClient工具访问Web请求
注意jar包是: HttpClient工具使用 HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程 ...
- 100 floors 2 eggs
https://github.com/Premiumlab/Python-for-Algorithms--Data-Structures--and-Interviews/blob/master/Moc ...
- 2018.07.18 HAOI2009 逆序对数列(线性dp)
传送门 目前只会n2" role="presentation" style="position: relative;">n2n2的dp" ...
- arduino 驱动电调
#include <TimerOne.h> #define PPMPIN 7 ; //0-9 ; void setup() { // put your setup code here, t ...
- Linux服务器部署系列之一—Apache篇(上)
Linux系统的应用越来越广泛了,学习linux系统的网管兄弟也有增加的趋势.很久以前就有些想法,要将自己学的linux知识整理一下.最近,终于下定决心,挤出时间开始动手写些东西了.虽然不一定好,不过 ...
- Airplace平台
Demo: 左上角:(0, 0)开始导航,手机终端上实时在地图上当前所在显示,当前点以绿色点显示,轨迹点以红色显示. 系统架构:基于移动手机的以网络为辅助的架构.特点:低头顶交流,用户隐私和安全 &g ...
- (并查集)How Many Tables -- HDU --1213
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1213 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- hdu 5032 不易发觉的树状数组
http://acm.hdu.edu.cn/showproblem.php?pid=5032 给定一个1000x1000的点阵,m组询问,每次询问一个由(0,0).(x,0)点一以及从原点出发的方向向 ...
- VSTS 更名为 Azure DevOps
微软正式对外宣布Azure DevOps,其实就是原来的VSTS,我们来看一下Azure DevOps的介绍: 今天我们宣布Azure DevOps.与世界各地的客户和开发人员合作,很明显,DevOp ...
- nodejs vinyl-fs 处理文件时输入问题
使用 nodejs vinyl-fs 复制文件时输出路径不对,还是会有原来的相对路径,原因是用了反斜杠“\”,正斜杠“/”没问题 测试过程 node版本: v9.3.0 系统:win10 步骤: 得到 ...