Luogu-2521 [HAOI2011]防线修建
倒过来处理所有询问,就变成了一道动态凸包的裸题
吐槽一下这道题只要维护上凸壳就好了,我zz了没好好看题打了两个2333
// luogu-judger-enable-o2
#include<set>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define rp (*r)
#define lp (*l)
#define rrp (*rr)
#define llp (*ll)
using namespace std;
const int maxn=1e6+100;
struct Vector{
double x,y;
Vector(double xx=0,double yy=0){
x=xx,y=yy;
}
};
struct Point{
double x,y;
Point(double xx=0,double yy=0){
x=xx,y=yy;
}
bool operator < (Point a) const{
return x==a.x?y<a.y:x<a.x;
}
}a[maxn],b[maxn],tmp[maxn];
int dcmp(double x){return fabs(x)<1e-9?0:x>0;}
bool operator == (Point a,Point b){return a.x==b.x&&a.y==b.y;}
Vector operator - (Point a,Point b){return Vector(a.x-b.x,a.y-b.y);}
double operator * (Vector a,Vector b){return a.x*b.y-a.y*b.x;}
double dot(Vector a,Vector b){return a.x*b.x+a.y*b.y;}
double len(Vector a){return sqrt(dot(a,a));}
int m,s,t,ms[maxn],err[maxn],c[maxn],n;
double pp,x,y,ans,an[maxn];
set<Point>u,d;
void tb(Point *p,int &n){
if(n==1) return;
sort(p+1,p+n+1);
tmp[1]=p[1];
int m=1;
for(int i=2;i<=n;i++){
while(m>1&&(tmp[m]-tmp[m-1])*(p[i]-tmp[m-1])<=0)
m--;
tmp[++m]=p[i];
}
for(int i=1;i<m;i++)
d.insert(tmp[i]),ans+=len(tmp[i+1]-tmp[i]);
d.insert(tmp[m]);
int k=m;
for(int i=n-1;i>=1;i--){
while(m>k&&(tmp[m]-tmp[m-1])*(p[i]-tmp[m-1])<=0)
m--;
tmp[++m]=p[i];
}
for(int i=k;i<m;i++)
u.insert(tmp[i]),ans+=len(tmp[i+1]-tmp[i]);
u.insert(tmp[m]);
ans-=pp;
}
void uinsert(Point p){
set<Point>::iterator l,r,ll,rr;
r=u.lower_bound(p);
l=--r,r++;
// printf("%lf %lf\n%lf %lf\n",lp.x,lp.y,rp.x,rp.y);
if((p-lp)*(rp-lp)>0) return;
ans=ans-len(rp-lp)+len(p-lp)+len(p-rp);
while(l!=u.begin()){
ll=--l,l++;
// printf("%lf %lf\n",llp.x,llp.y);
if((lp-llp)*(p-llp)<0) break;
// printf("%lf %lf %lf\n",len(p-lp),len(lp-llp),len(p-llp));
ans=ans-len(p-lp)-len(lp-llp)+len(p-llp);
u.erase(l);
l=ll;
}
rr=++r,r--;
while(rr!=u.end()){
// printf("%lf %lf\n",rrp.x,rrp.y);
if((rrp-p)*(rp-p)>0) break;
// printf("%lf %lf %lf\n",len(rp-p),len(rrp-rp),len(rrp-p));
ans=ans-len(rp-p)-len(rrp-rp)+len(rrp-p);
u.erase(r);
r=rr;
rr=++r,r--;
}
u.insert(p);
}
/*
void dinsert(Point p){
set<Point>::iterator l,r,ll,rr;
r=d.lower_bound(p);
l=--r,r++;
if((p-lp)*(rp-lp)<0) return;
ans=ans-len(rp-lp)+len(p-lp)+len(p-rp);
while(l!=d.begin()){
ll=--l,l++;
if((lp-llp)*(p-llp)>0) break;
ans=ans-len(lp-p)-len(llp-lp)+len(llp-p);
u.erase(l);
l=ll;
}
rr=++r,r--;
while(rr!=d.end()){
if((rrp-p)*(rp-p)>0) break;
ans=ans-len(rp-p)-len(rrp-rp)+len(rrp-p);
u.erase(r);
r=rr;
rr=++r,r--;
}
d.insert(p);
}
*/
int main(){
scanf("%lf%lf%lf",&pp,&x,&y);
scanf("%d",&m);
for(int i=1;i<=m;i++)
scanf("%lf%lf",&b[i].x,&b[i].y);
scanf("%d",&t);
for(int i=1;i<=t;i++){
scanf("%d",&ms[i]);
if(ms[i]==1){
scanf("%d",&c[i]);
err[c[i]]=1;
}
}
a[1].x=a[1].y=a[2].y=0;
a[2].x=pp,a[3].x=x,a[3].y=y;
n=3;
for(int i=1;i<=m;i++)
if(!err[i])
a[++n]=b[i];
tb(a,n);
for(int i=t;i>=1;i--){
if(ms[i]==1)
uinsert(b[c[i]]);//,dinsert(b[c[i]]);
else
an[i]=ans;
}
for(int i=1;i<=t;i++)
if(ms[i]==2)
printf("%.2lf\n",an[i]);
return 0;
}
Luogu-2521 [HAOI2011]防线修建的更多相关文章
- [luogu P2521] [HAOI2011]防线修建
[luogu P2521] [HAOI2011]防线修建 题目描述 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国 ...
- 【BZOJ 2300】 2300: [HAOI2011]防线修建 (动态凸包+set)
2300: [HAOI2011]防线修建 Description 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上 ...
- BZOJ 2300: [HAOI2011]防线修建( 动态凸包 )
离线然后倒着做就变成了支持加点的动态凸包...用平衡树维护上凸壳...时间复杂度O(NlogN) --------------------------------------------------- ...
- P2521 [HAOI2011]防线修建
题目链接:P2521 [HAOI2011]防线修建 题意:给定点集 每次有两种操作: 1. 删除一个点 (除开(0, 0), (n, 0), 与指定首都(x, y)) 2. 询问上凸包长度 至于为什么 ...
- bzoj千题计划236:bzoj2300: [HAOI2011]防线修建
http://www.lydsy.com/JudgeOnline/problem.php?id=2300 维护动态凸包,人懒用的set 用叉积判断,不要用斜率 #include<set> ...
- 【BZOJ2300】[HAOI2011]防线修建 set维护凸包
[BZOJ2300][HAOI2011]防线修建 Description 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可 ...
- 【题解】P2521 [HAOI2011]防线修建(动态凸包)
[题解]P2521 [HAOI2011]防线修建(动态凸包) 凸包是易插入不好删除的东西,按照剧情所以我们时光倒流 然后问题就是维护凸包的周长,支持加入 本来很简单,但是计算几何就是一些小地方经验不足 ...
- 【bzoj2300】【Luogu P2521】 [HAOI2011]防线修建 动态凸包,平衡树,Set
一句话题意:给你一个凸包,每次可以插入一个点或者询问周长. 动态凸包裸题嘛,用\(Set\)实现.最初每个点坐标做乘三处理,便于取初始三角形的重心作为凸包判定原点. #include <bits ...
- BZOJ2300[HAOI2011]防线修建——非旋转treap+凸包(平衡树动态维护凸包)
题目描述 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上层现在还犹豫不决,到底该把哪些城市作为保护对象呢?又由于 ...
- LG2521 [HAOI2011]防线修建
题意 题目描述 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上层现在还犹豫不决,到底该把哪些城市作为保护对象呢? ...
随机推荐
- php匿名函数和闭包函数及use关键字传参及Closure匿名函数类
php闭包函数用use传参有什么意义?答:use引用外层变量,比如全局变量 Closure,匿名函数,是php5.3的时候引入的,又称为Anonymous functions.字面意思也就是没有定义名 ...
- PSSM特征-从生成到处理
以下代码均为个人原创,如有疑问,欢迎交流.新浪微博:拾毅者 本节内容: pssm生成 pssm简化 标准的pssm构建 滑动pssm生成 在基于蛋白质序列的相关预測中.使用PSSM打分矩阵会得将预測效 ...
- PyQt5 GUI Programming With Python 3.6 (一)
PyQt5 PyQt5是一个基于强大的图形程式框架Qt5的python接口, 主要包含以下几个大类: ● QtCore ● QtGui ● QtWidgets ● QtMultimedia ● QtB ...
- git入门四(分支创建合并)
熟悉git分支的原理是掌握了git的精髓,因为git和我们常用的源码管理系统有很大的区别和优点在分支上可以体现出来,一般我们常用的源码管理系统分支都是需要创建新目录,有全新的源码copy,一般都需要创 ...
- Latex中參考文献排序
\bibliographystyle{unsrt}:依照引用的先后排序 \bibliographystyle{plain}:按字母的顺序排列,比較次序为作者.年度和标题.当中作者中姓氏字母优先. 关于 ...
- IOS发送带附件的邮件
本文转载至 http://blog.csdn.net/zltianhen/article/details/7693810 1.加入邮箱的框架 #import <MessageUI/MFMail ...
- hihocoder1260,1261 (HASH经典题)
这两题比赛做的时候各种卡,太久没有写过这种类型的题目了.各种细节想不清楚. 赛后看下网上大部分题解的代码,发现大部分都是直接用TRIE+暴力直接搞的--!,随便找了份代码发现有些数据这种做法是超时的, ...
- 【BZOJ4128】Matrix BSGS+hash
[BZOJ4128]Matrix Description 给定矩阵A,B和模数p,求最小的x满足 A^x = B (mod p) Input 第一行两个整数n和p,表示矩阵的阶和模数,接下来一个n * ...
- 【BZOJ1513】[POI2006]Tet-Tetris 3D 二维线段树
[BZOJ1513][POI2006]Tet-Tetris 3D Description Task: Tetris 3D "Tetris" 游戏的作者决定做一个新的游戏, 一个三维 ...
- wxwidget自定义消息处理步骤
from http://www.cppblog.com/kenlistian/archive/2009/02/06/73096.html 略有修改 wxwidget自定义消息处理步骤 自定义消息处理( ...