BZOJ2300[HAOI2011]防线修建——非旋转treap+凸包(平衡树动态维护凸包)
题目描述

上图中,A,B,C,D,E点为A国城市,且目前都要保护,那么修建的防线就会是A-B-C-D,花费也就是线段AB的长度+线段BC的长度+线段CD的长度,如果,这个时候撤销B点的保护,那么防线变成下图
输入
输出
对于每个询问输出1行,一个实数v,表示修建防线的花费,保留两位小数
样例输入
2
1 2
3 2
5
2
1 1
2
1 2
2
样例输出
5.84
4.47
提示
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
struct lty
{
int x,y;
lty(int X=0,int Y=0){x=X,y=Y;}
bool operator <(const lty &a)const{return x==a.x?y<a.y:x<a.x;}
lty operator -(const lty &a)const{return lty(x-a.x,y-a.y);}
}p[100010],s[100010],st[100010],tr[100010];
int cnt;
int top;
int tot;
int x,y;
int root;
int n,m,Q;
int ls[100010];
int rs[100010];
int r[100010];
int size[100010];
double ans;
int a,b,c,d;
int vis[100010];
struct yzl
{
int opt,id;
double res;
}q[200010];
ll cross(lty a,lty b)
{
return 1ll*a.x*b.y-1ll*a.y*b.x;
}
int newnode(int x,int y)
{
int rt=++cnt;
tr[rt].x=x;
tr[rt].y=y;
r[rt]=rand();
size[rt]=1;
return rt;
}
void pushup(int rt)
{
size[rt]=size[ls[rt]]+size[rs[rt]]+1;
}
double dis(lty a,lty b)
{
lty c=a-b;
return sqrt(1ll*c.x*c.x+1ll*c.y*c.y);
}
int merge(int x,int y)
{
if(!x||!y)
{
return x+y;
}
if(r[x]<r[y])
{
rs[x]=merge(rs[x],y);
pushup(x);
return x;
}
else
{
ls[y]=merge(x,ls[y]);
pushup(y);
return y;
}
}
void split_value(int rt,int &x,int &y,int k,int z)
{
if(!rt)
{
x=y=0;
return ;
}
if(tr[rt].x>k||(tr[rt].x==k&&tr[rt].y>z))
{
y=rt;
split_value(ls[rt],x,ls[y],k,z);
}
else
{
x=rt;
split_value(rs[rt],rs[x],y,k,z);
}
pushup(rt);
}
void split_left(int rt,int &x,int &y,int k)
{
if(!rt)
{
x=y=0;
return ;
}
if(size[ls[rt]]>=k)
{
y=rt;
split_left(ls[rt],x,ls[y],k);
}
else
{
x=rt;
split_left(rs[rt],rs[x],y,k-size[ls[rt]]-1);
}
pushup(rt);
}
void split_right(int rt,int &x,int &y,int k)
{
if(!rt)
{
x=y=0;
return ;
}
if(size[rs[rt]]>=k)
{
x=rt;
split_right(rs[rt],rs[x],y,k);
}
else
{
y=rt;
split_right(ls[rt],x,ls[y],k-size[rs[rt]]-1);
}
pushup(rt);
}
int build(int l,int r)
{
if(l==r)
{
return newnode(st[l].x,st[l].y);
}
int mid=(l+r)>>1;
return merge(build(l,mid),build(mid+1,r));
}
int main()
{
srand(12378);
scanf("%d%d%d",&n,&x,&y);
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
}
p[m+1].x=x,p[m+1].y=y;
p[m+2].x=0,p[m+2].y=0;
p[m+3].x=n,p[m+3].y=0;
m+=3;
scanf("%d",&Q);
for(int i=1;i<=Q;i++)
{
scanf("%d",&q[i].opt);
if(q[i].opt==1)
{
scanf("%d",&q[i].id);
vis[q[i].id]=1;
}
}
for(int i=1;i<=m;i++)
{
if(!vis[i])
{
s[++tot]=p[i];
}
}
sort(s+1,s+1+tot);
for(int i=1;i<=tot;i++)
{
while(top>1&&cross(st[top-1]-st[top],s[i]-st[top])<=0)
{
top--;
}
st[++top]=s[i];
}
root=build(1,top);
for(int i=2;i<=top;i++)
{
ans+=dis(st[i-1],st[i]);
}
for(int i=Q;i>=1;i--)
{
if(q[i].opt==2)
{
q[i].res=ans;
}
else
{
int now=q[i].id;
split_value(root,a,d,p[now].x,p[now].y);
split_right(a,a,b,1);
split_left(d,c,d,1);
if(cross(tr[b]-p[now],tr[c]-p[now])<=0)
{
a=merge(a,b);
d=merge(c,d);
root=merge(a,d);
continue;
}
ans-=dis(tr[b],tr[c]);
a=merge(a,b);
d=merge(c,d);
split_right(a,a,c,1);
split_right(a,a,b,1);
while(b&&c&&cross(tr[b]-tr[c],p[now]-tr[c])<=0)
{
ans-=dis(tr[b],tr[c]);
c=b;
split_right(a,a,b,1);
}
ans+=dis(p[now],tr[c]);
a=merge(a,b);
a=merge(a,c);
split_left(d,b,d,1);
split_left(d,c,d,1);
while(b&&c&&cross(p[now]-tr[b],tr[c]-tr[b])<=0)
{
ans-=dis(tr[b],tr[c]);
b=c;
split_left(d,c,d,1);
}
ans+=dis(p[now],tr[b]);
d=merge(c,d);
d=merge(b,d);
root=merge(merge(a,newnode(p[now].x,p[now].y)),d);
}
}
for(int i=1;i<=Q;i++)
{
if(q[i].opt==2)
{
printf("%.2f\n",q[i].res);
}
}
}
BZOJ2300[HAOI2011]防线修建——非旋转treap+凸包(平衡树动态维护凸包)的更多相关文章
- 2019.02.21 bzoj2300: [HAOI2011]防线修建(set+凸包)
传送门 题意:动态维护凸包周长. 思路: 见这篇求面积的吧反正都是一个套路. 代码: #include<bits/stdc++.h> #define int long long #defi ...
- bzoj千题计划236:bzoj2300: [HAOI2011]防线修建
http://www.lydsy.com/JudgeOnline/problem.php?id=2300 维护动态凸包,人懒用的set 用叉积判断,不要用斜率 #include<set> ...
- BZOJ2300: [HAOI2011]防线修建
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2300 (我只是在发以前写过的题.. 因为题目没说强制在线,所以离线乱搞就可以了.先把点删掉然后 ...
- 非旋转Treap——普通平衡树
扔板跑…… #include<bits/stdc++.h> #define N 100010 #define mp make_pair using namespace std; typed ...
- 【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) --------------------------------------------------- ...
- 【题解】P2521 [HAOI2011]防线修建(动态凸包)
[题解]P2521 [HAOI2011]防线修建(动态凸包) 凸包是易插入不好删除的东西,按照剧情所以我们时光倒流 然后问题就是维护凸包的周长,支持加入 本来很简单,但是计算几何就是一些小地方经验不足 ...
- 「BZOJ2300」[HAOI2011] 防线修建
传送门 操作离线之后倒着做,只有加点操作. 用set动态维护凸包即可. //Achen #include<algorithm> #include<iostream> #incl ...
随机推荐
- 在嵌入式设备中使用 JavaScript 的前景
by Conmajia PC上的JavaScript已经发展到ECMAScript 6(ES6),马上ES10都快出来了(虽然还是草案),但是硬件上的JS却很少听说.这几年手持设备/可穿戴设备的发展非 ...
- redis的持久化方式RDB和AOF的区别
1.前言 最近在项目中使用到Redis做缓存,方便多个业务进程之间共享数据.由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能, ...
- Vue + WebApi 小项目:构造自己的在线 Markdown 笔记本应用
Vue + WebApi 小项目:构造自己的在线 Markdown 笔记本应用 目录 概要 知识点 完整示例图 代码与资源文件 流程步骤 概要 基于 MVP 最小可行性产品设计理念,我们先完成一个可以 ...
- MySQL 笔记整理(17) --如何正确地显示随机消息?
笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> (本篇内图片均来自丁奇老师的讲解,如有侵权,请联系我删除) 17) --如何正确地显示随机消息? 如果有这么一个英语单词表,需要每次 ...
- spring通知执行的顺序
点击下载本示例相关代码 关于spring aop的具体使用,暂时不在这里讲解,后面会特定来讲解,本次主要探讨spring中通知执行的顺序. spring中通知分为以下几种: before:前置通知,在 ...
- 【MySQL】MySQL的执行计划及索引优化
我们知道一般图书馆都会建书目索引,可以提高数据检索的效率,降低数据库的IO成本.MySQL在300万条记录左右性能开始逐渐下降,虽然官方文档说500~800w记录,所以大数据量建立索引是非常有必要的. ...
- jenkins实现以gitlab为代码仓库的构建
简介 前一篇随笔是安装jenkins的过程,比较简单,这一次说一下用jenkins配置以gitlab为代码管理仓库的maven项目的完整个构建过程,以及我碰到的一些问题.由于是maven项目,所以我们 ...
- Arch LInux安装dde(Deepin Desktop Environment 深度桌面环境)
我一直比较推荐一些Linux新手使用Deepin Linux,因为我认为这种尽量的follow Windows的系统至少对于新手来说是比较的友好的,而且预装了QQ 火狐浏览器中文版,甚至还移植了像36 ...
- 网络浅析(<<网络是怎么连接的>> 总结)
概要 基本概念 网线 集线器 交换机 路由器 路由器和交换机 路由器和集线器 接入网 IP DNS 以太网 协议栈 网络连接过程 通信过程(浏览器 -> 服务器) 客户端和服务端 服务端的套接字 ...
- 从零开始制作 Hexo 主题
原文地址:从零开始制作 Hexo 主题 · Ahonn 写在前面 本文将会从零开始开发一个简单的博客主题.样式主要参考 Hexo theme 中的 Noise 主题. 开始之前你需要了解: 模板引擎 ...