BZOJ 2300凸包+离线
思路:
倒着加显然吧 动态维护这个凸包就好了
//By SiriusRen
#include <bits/stdc++.h>
using namespace std;
const int N=;
int n,m,q,vis[N];
double now;
struct Point{int x,y;}point[N],jy,tmp,tt;
struct Query{int x,op;double ans;}ask[N];
Point operator-(Point a,Point b){
Point c;c.x=a.x-b.x,c.y=a.y-b.y;return c;
}
int operator*(Point a,Point b){
return a.x*b.y-a.y*b.x;
}
bool operator<(Point a,Point b){
if(a.x!=b.x)return a.x<b.x;
return a.y<b.y;
}
double dis(Point a,Point b){
a=a-b;return sqrt(a.x*a.x+a.y*a.y);
}
set<Point>s;set<Point>::iterator l,r,t;
void insert(Point a){
r=s.lower_bound(a),l=r,l--;
if((*r-*l)*(a-*l)<)return;
now-=dis((*l),(*r));
s.insert(a),t=r,r++;
while(r!=s.end()&&(*r-a)*(*t-a)<)
now-=dis(*t,*r),s.erase(t),t=r,r++;
while(l!=s.begin()){
t=l,l--;
if((*t-a)*(*l-a)>)break;
now-=dis(*t,*l),s.erase(t);
}
l=r=t=s.find(a),l--,r++;
now+=dis(*l,a)+dis(*r,a);
}
int main(){
s.insert(tt);
scanf("%d%d%d%d",&n,&jy.x,&jy.y,&m);
tmp.x=n;now+=dis(tt,jy)+dis(jy,tmp);
for(int i=;i<=m;i++)
scanf("%d%d",&point[i].x,&point[i].y);
scanf("%d",&q);
for(int i=;i<=q;i++){
scanf("%d",&ask[i].op);
if(ask[i].op==)scanf("%d",&ask[i].x),vis[ask[i].x]=;
}s.insert(jy),s.insert(tmp);
for(int i=;i<=m;i++)if(!vis[i])insert(point[i]);
for(int i=q;i;i--){
if(ask[i].op==)insert(point[ask[i].x]);
else ask[i].ans=now;
}
for(int i=;i<=q;i++)
if(ask[i].op!=)printf("%.2lf\n",ask[i].ans);
}
BZOJ 2300凸包+离线的更多相关文章
- 【BZOJ 2300】 2300: [HAOI2011]防线修建 (动态凸包+set)
2300: [HAOI2011]防线修建 Description 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上 ...
- BZOJ 2300: [HAOI2011]防线修建( 动态凸包 )
离线然后倒着做就变成了支持加点的动态凸包...用平衡树维护上凸壳...时间复杂度O(NlogN) --------------------------------------------------- ...
- bzoj 2300: [HAOI2011]防线修建 凸包
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=2300 题解 这道题让我们维护一个支持动态删除点的上凸壳 并且告诉了我们三个一定不会被删除 ...
- bzoj 2300 [HAOI2011]防线修建 set动态维护凸包
题目大意 动态删点,求凸包周长 分析 反过来变成动态加点 用set维护平衡树 具体是找到凸包上左右两点 拆开 就可以把左边当作顺时针求的一个凸包,右边当作逆时针求的一个凸包,像栈那样出set就好了 注 ...
- 防线修建 bzoj 2300
防线修建(1s 512MB)defense [问题描述] 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上层现在还 ...
- BZOJ 2300 防线修建
http://www.lydsy.com/JudgeOnline/problem.php?id=2300 题意:给点,有以下操作:删去一个点,询问这些点构成凸包的周长. 思路:用splay维护上凸壳, ...
- BZOJ 4140 凸包+二进制分组
思路: $(x_0-x)^2+(y_0-y)^2<=x^2+y^2$ $y>=(-x_0/y_0)x+(x_0^2+y_0^2)/2y0$ 这显然就是凸包了 以一个斜率不断向下(上)走 ...
- BZOJ 3585: mex( 离线 + 线段树 )
离线, 询问排序. 先处理出1~i的答案, 这样可以回答左端点为1的询问.完成后就用seq(1)将1到它下一次出现的位置前更新. 不断这样转移就OK了 ------------------------ ...
- bzoj 2300 : [HAOI2011]防线修建
set动态维护凸包 #include<iostream> #include<cstdio> #include<cstring> #include<algori ...
随机推荐
- concepts in Turbulent Flow
Table of Contents 1. Concepts/Glossary 1.1. Turbulent eddy viscosity ,μt 1.2. Turbulent kinetic ener ...
- python正则表达式提取字符串
用python正则表达式提取字符串 在日常工作中经常遇见在文本中提取特定位置字符串的需求.python的正则性能好,很适合做这类字符串的提取,这里讲一下提取的技巧,正则表达式的基础知识就不说了,有兴趣 ...
- 洛谷 1712 BZOJ 4653 [NOI2016]区间
[题解] 先把区间按照未离散化的长度排序,保存区间长度,然后离散化区间端点.每次把区间覆盖的点的覆盖次数加1,如果某个点被覆盖次数大于等于m,就从前往后开始删除区间直到没有一个点被覆盖的次数大于等于m ...
- Entity SQL rules for Wrapped and Unwrapped Results
Here are some rules to remember for Entity SQL queries: 1.Use SELECT VALUE when projecting more than ...
- nyoj 31 5个数求最值
5个数求最值 时间限制:1000 ms | 内存限制:65535 KB 难度:1 描述 设计一个从5个整数中取最小数和最大数的程序 输入 输入只有一组测试数据,为五个不大于1万的正整数 输 ...
- zoj 1008 暴力枚举求解dfs+优化
/* 现将相同的合并计数. 再枚举判断是否符合当cou==n*n是符合就退出 */ #include<stdio.h> #include<string.h> #define N ...
- 统计单词个数(codevs 1040)
题目描述 Description 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1<k<= ...
- TCP/IP协议1
1.分层 应用层 telent 远程登录,ftp 文件传输协议,smtp 简单邮件传送协议 snmp 简单网络管理协议 email 运输层 tcp(提供可靠的数据通信)和udp(数据报的分组从一台主 ...
- [bzoj5301][Cqoi2018]异或序列_莫队
异或序列 bzoj-5301 Cqoi-2018 题目大意:题目链接. 注释:略. 想法: 由于a^a=0这个性质,我们将所有的数变成异或前缀和. 所求就变成了求所有的$l_i\le x<y\l ...
- [bzoj1582][Usaco2009 Hol]Holiday Painting 节日画画_线段树
Holiday Painting 节日画画 bzoj-1582 Usaco-2009 Hol 题目大意:给定两个n*m的01网格图.q次操作,每次将第二个网格图的子矩阵全部变成0或1,问每一次操作后两 ...