bzoj2300【HAOI2011】防线修建
题目描述
上图中,A,B,C,D,E点为A国城市,且目前都要保护,那么修建的防线就会是A-B-C-D,花费也就是线段AB的长度+线段BC的长度+线段CD的长度,如果,这个时候撤销B点的保护,那么防线变成下图
输入格式
输出格式
对于每个询问输出1行,一个实数v,表示修建防线的花费,保留两位小数
提示
题解:
- 考虑倒着把点插入凸包;
- 只需要每次找到点在原凸包的$x$坐标前驱后继删掉不构成凸包的再插入;
- 可以用$splay$维护即可(常数不太好看)
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cmath>
#include<vector>
#include<stack>
#include<map>
#include<set>
#define Run(i,l,r) for(int i=l;i<=r;i++)
#define Don(i,l,r) for(int i=l;i>=r;i--)
#define ll long long
#define ld double
#define inf 0x3f3f3f3f
#define mk make_pair
#define fir first
#define sec second
#define il inline
#define rg register
#define pb push_back
using namespace std;
const int N=;
int n,m,mx,tx,ty,ch[N][],sz[N],fa[N],vis[N],rt,cnt;
ld now,ans[N<<];
il char gc(){
static char*p1,*p2,s[];
if(p1==p2)p2=(p1=s)+fread(s,,,stdin);
return(p1==p2)?EOF:*p1++;
}
il int rd(){
int x=; char c=gc();
while(c<''||c>'')c=gc();
while(c>=''&&c<='')x=(x<<)+(x<<)+c-'',c=gc();
return x;
}
struct poi{
int x,y;
poi(int _x=,int _y=):x(_x),y(_y){};
bool operator <(const poi&A)const{return x==A.x?y<A.y:x<A.x;}
poi operator -(const poi&A)const{return poi(x-A.x,y-A.y);}
}p[N],q[N],Q[N<<];
int crs(poi A,poi B){return A.x*B.y-A.y*B.x;}
int dot(poi A,poi B){return A.x*B.x+A.y*B.y;}
ld dis(poi A){return sqrt(A.x*A.x+A.y*A.y);}
il void update(int x){sz[x]=sz[ch[x][]]+sz[ch[x][]]+;}
il void rotate(int x,int&k){
int y=fa[x],z=fa[y];
if(y==k)k=x;else ch[z][ch[z][]==y]=x;
int l=ch[y][]==x,r=l^;
fa[x]=z;fa[y]=x;fa[ch[x][r]]=y;
ch[y][l]=ch[x][r],ch[x][r]=y;
update(y);update(x);
}
il void splay(int x,int&k){
for(int y,z;x!=k;rotate(x,k)){
y=fa[x],z=fa[y];
if(y!=k)rotate( (ch[y][]==x)^(ch[z][]==y) ? x : y ,k);
}
}
il void ins(int&k,int x){
if(!k)q[k=++cnt]=p[x];
else {
if(p[x]<q[k])ins(ch[k][],x),fa[ch[k][]]=k;
else ins(ch[k][],x),fa[ch[k][]]=k;
}
update(k);
}
il int find_pre(int k,int x){
int re=;
while(k){
if(q[k]<p[x])re=k,k=ch[k][];
else k=ch[k][];
}
return re;
}
il int find_nxt(int k,int x){
int re=;
while(k){
if(p[x]<q[k])re=k,k=ch[k][];
else k=ch[k][];
}
return re;
}
il void insert(int x){
int T1=find_pre(rt,x),T2=find_nxt(rt,x),t1,t2;
if(crs(p[x]-q[T1],q[T2]-p[x])>=)return;
now -= dis(q[T1]-q[T2]);
for(splay(t1=T1,rt),t2=ch[t1][];sz[t2];){
while(ch[t2][])t2=ch[t2][];
splay(t2,ch[t1][]);
if(crs(q[t1]-q[t2],p[x]-q[t1])>=){
now -= dis(q[t1]-q[t2]);
fa[ch[t2][]=ch[t1][]]=t2;
update(rt=t2);
t1=t2,t2=ch[t1][];
}else break;
}
now += dis(p[x]-q[t1]);
for(splay(t1=T2,rt),t2=ch[t1][];sz[t2];){
while(ch[t2][])t2=ch[t2][];
splay(t2,ch[t1][]);
if(crs(q[t1]-q[t2],p[x]-q[t1])<=){
now -= dis(q[t1]-q[t2]);
fa[ch[t2][]=ch[t1][]]=t2;
update(rt=t2);
t1=t2,t2=ch[t1][];
}else break;
}
now += dis(p[x]-q[t1]);
ins(rt,x);
}
int main(){
#ifndef ONLINE_JUDGE
freopen("bzoj2300.in","r",stdin);
freopen("bzoj2300.out","w",stdout);
#endif
mx=rd();tx=rd();ty=rd();n=rd();
for(int i=;i<=n;++i)p[i].x=rd(),p[i].y=rd();
p[]=poi(,);ins(rt,);
p[n+]=poi(mx,);ins(rt,n+);
p[n+]=poi(tx,ty);ins(rt,n+);
now = dis(p[]-p[n+]) + dis(p[n+]-p[n+]);
m=rd();for(int i=;i<=m;++i){Q[i].x=rd();if(Q[i].x&)vis[Q[i].y=rd()]=;}
for(int i=;i<=n;++i)if(!vis[i])insert(i);
for(int i=m;i;--i)if(Q[i].x&)insert(Q[i].y);else ans[i]=now;
for(int i=;i<=m;++i)if(Q[i].x==)printf("%.2lf\n",ans[i]);
return ;
}//by tkys_Austin;bzoj2300
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]防线修建(动态凸包) 凸包是易插入不好删除的东西,按照剧情所以我们时光倒流 然后问题就是维护凸包的周长,支持加入 本来很简单,但是计算几何就是一些小地方经验不足 ...
随机推荐
- Spark概述及集群部署
Spark概述 什么是Spark (官网:http://spark.apache.org) Spark是一种快速.通用.可扩展的大数据分析引擎,2009年诞生于加州大学伯克利分校AMPLab,2010 ...
- 关于go语言中的WaitGroup
如果你刚接触Go语言并且想用它构建高并发,高性能的应用,弄明白WaitGroups是怎么回事很重要. 在本教程中,我们将掌握以下内容: WaitGroups的用途 一个WaitGroups的简单示例 ...
- MariaDB远程连接问题
MariaDB在设置完通过Navicat Premium远程连接账号验证通过,但是无法正常使用工具的功能,只能使用sql语句查询,但是通过控制台命令功能正常. 经过修改账号权限,添加新用户等功能都无法 ...
- 2-Seventh Scrum Meeting20151207
任务分配 闫昊: 今日完成:完成数据库设计. 明日任务:和唐彬讨论接口如何在android实现. 唐彬: 今日完成:读了IOS讨论区后台接口. 明日任务:和闫昊讨论接口如何在android实现. 史烨 ...
- 第五周作业总结(内含用Junit测试ArrayStack和LinkedStack课堂练习报告)
---恢复内容开始--- 学号 20162310<程序设计与数据结构>第五周学习总结 教材学习内容总结 集合分为线性集合(集合中的元素排成一行)和非线性集合(按不同于一行的方式来组织元素, ...
- 自学iOS-获取当前时间
NSDate * senddate=[NSDate date]; NSDateFormatter *dateformatter=[[NSDateFormatter alloc] init]; [dat ...
- Internet History, Technology and Security (Week⑨)
Week ⑨ We are now on the second to last week of the class and finishing up our look at Internet Secu ...
- 团队作业7——第二次项目冲刺(Beta版本12.07——12.08)
1.当天站立式会议照片 本次会议在5号公寓3楼召开,本次会议内容:①:熟悉每个人想做的模块.②:根据项目要求还没做的完成. 2.每个人的工作 经过会议讨论后确定了每个人的分工 组员 任务 陈福鹏 实现 ...
- Head First Java & 重载 覆盖
- Beta阶段——第四篇 Scrum 冲刺博客
i. 提供当天站立式会议照片一张: ii. 每个人的工作 (有work item 的ID) (1) 昨天已完成的工作: 充值与账单的数据库操作结合,实现余额功能 (2) 今天计划完成的工作: 用户权限 ...