Bzoj2300 / 洛谷P2521 [HAOI2011]防线修建
题目描述
近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了。可是A国上层现在还犹豫不决,到底该把哪些城市作为保护对象呢?又由于A国的经费有限,所以希望你能帮忙完成如下的一个任务:
给出你所有的A国城市坐标
A国上层经过讨论,考虑到经济问题,决定取消对i城市的保护,也就是说i城市不需要在防线内了
A国上层询问对于剩下要保护的城市,修建防线的总经费最少是多少
你需要对每次询问作出回答。注意单位1长度的防线花费为1。
A国的地形是这样的,形如下图,x轴是一条河流,相当于一条天然防线,不需要你再修建
A国总是有两个城市在河边,一个点是(0,0),一个点是(n,0),其余所有点的横坐标均大于0小于n,纵坐标均大于0。A国有一个不在(0,0)和(n,0)的首都。(0,0),(n,0)和首都这三个城市是一定需要保护的。
输入输出格式
输入格式:
第一行,三个整数n,x,y分别表示河边城市和首都是(0,0),(n,0),(x,y)。
第二行,一个整数m。
接下来m行,每行两个整数a,b表示A国的一个非首都非河边城市的坐标为(a,b)。
再接下来一个整数q,表示修改和询问总数。
接下来q行每行要么形如1 i,要么形如2,分别表示撤销第i个城市的保护和询问。
输出格式:
对于每个询问输出1行,一个实数v,表示修建防线的花费,保留两位小数
输入输出样例
4 2 1
2
1 2
3 2
5
2
1 1
2
1 2
2
6.47
5.84
4.47
说明
数据范围:
30%的数据m<=1000,q<=1000
100%的数据m<=100000,q<=200000,n>1
所有点的坐标范围均在10000以内, 数据保证没有重点
数学问题 计算几何 凸包
由于下边不用考虑,实际上我们只需要维护一个上凸壳。
离线询问,倒序加点,如果新加入的点在凸壳下面,就无视它,如果在凸壳上面,就将它加入凸壳,并删除原凸壳上的无用点。
凸壳上的点集可以用set或者平衡树维护。
倒序加点的时候忘了把没被删过的点先加进去,WA了一发
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
#include<set>
using namespace std;
const double eps=1e-;
const int mxn=;
int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
struct point{
double x,y;
point operator + (point b){return (point){x+b.x,y+b.y};}
point operator - (point b){return (point){x-b.x,y-b.y};}
double operator * (point b){return x*b.x+y*b.y;}
bool operator < (point b)const{
return x<b.x || (x==b.x && y<b.y);
}
}a[mxn];
int cnt=;
double Cross(point a,point b){
return a.x*b.y-a.y*b.x;
}
double dist(point a,point b){
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
struct query{
int id,tp;
}q[mxn];
struct cmp{bool operator () (const int c,const int d){return a[c].x<a[d].x;}};
set<int,cmp>st;
double nowans,ans[mxn];
int top=;
void solve(int x){
set<int,cmp>::iterator it,iL,iR;
it=st.lower_bound(x);
iL=it;iL--;
int L=*iL,R=*it;
if(Cross(a[x]-a[L],a[R]-a[x])>)return;//在已有凸壳内
nowans-=dist(a[L],a[R]);
while(){
R=*it;it++;
if(it==st.end())break;
if(Cross(a[R]-a[x],a[*it]-a[x])>){
nowans-=dist(a[R],a[*it]);
st.erase(R);
}
else break;
}
while(){
if(iL==st.begin())break;
L=*iL;iL--;
if(Cross(a[L]-a[*iL],a[x]-a[*iL])>){
nowans-=dist(a[*iL],a[L]);
st.erase(L);
}
else break;
}
st.insert(x);
it=st.find(x);
iL=it;iL--;iR=it;iR++;
nowans+=dist(a[*iL],a[x])+dist(a[x],a[*iR]);
return;
}
bool vis[mxn];
int n,m,Q;
int main(){
// freopen("defense.in","r",stdin);
// freopen("defense.out","w",stdout);
int i,j,x,y;
n=read();x=read();y=read();
a[++cnt]=(point){,};a[++cnt]=(point){n,};a[++cnt]=(point){x,y};
st.insert();st.insert();st.insert();
nowans+=dist(a[],a[])+dist(a[],a[]);
m=read();
for(i=;i<=m;i++){
++cnt;
a[cnt].x=read();a[cnt].y=read();
}
Q=read();
for(i=;i<=Q;i++){
q[i].tp=read();
if(q[i].tp==) q[i].id=read(),vis[q[i].id]=;
}
for(i=;i<=m;i++){
if(!vis[i])solve(i+);
}
for(i=Q;i;i--){
if(q[i].tp==){
ans[++top]=nowans;
continue;
}
solve(q[i].id+);
}
while(top){
printf("%.2f\n",ans[top--]);
}
return ;
}
Bzoj2300 / 洛谷P2521 [HAOI2011]防线修建的更多相关文章
- [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]防线修建(动态凸包) 凸包是易插入不好删除的东西,按照剧情所以我们时光倒流 然后问题就是维护凸包的周长,支持加入 本来很简单,但是计算几何就是一些小地方经验不足 ...
- 【BZOJ2300】[HAOI2011]防线修建 set维护凸包
[BZOJ2300][HAOI2011]防线修建 Description 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可 ...
- bzoj千题计划236:bzoj2300: [HAOI2011]防线修建
http://www.lydsy.com/JudgeOnline/problem.php?id=2300 维护动态凸包,人懒用的set 用叉积判断,不要用斜率 #include<set> ...
- 【BZOJ 2300】 2300: [HAOI2011]防线修建 (动态凸包+set)
2300: [HAOI2011]防线修建 Description 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上 ...
- BZOJ 2300: [HAOI2011]防线修建( 动态凸包 )
离线然后倒着做就变成了支持加点的动态凸包...用平衡树维护上凸壳...时间复杂度O(NlogN) --------------------------------------------------- ...
- 洛谷 P2323 [HNOI2006]公路修建问题 解题报告
P2323 [HNOI2006]公路修建问题 题目描述 输入输出格式 输入格式: 在实际评测时,将只会有m-1行公路 输出格式: 思路: 二分答案 然后把每条能加的大边都加上,然后加小边 但在洛谷的题 ...
- 洛谷P2522 - [HAOI2011]Problem b
Portal Description 进行\(T(T\leq10^5)\)次询问,每次给出\(x_1,x_2,y_1,y_2\)和\(d\)(均不超过\(10^5\)),求\(\sum_{i=x_1} ...
随机推荐
- Log4Net的使用研究(一)
等待研究中………… 20160421 标题:C#使用Log4Net记录日志 文章地址: http://www.cnblogs.com/wangsaiming/archive/2013/01/11/ ...
- Dijkstra+优先队列 模板
#include<bits/stdc++.h> using namespace std; #define ll long long ; const ll inf=1e17; struct ...
- QMetaEnum利用Qt元数据实现枚举(enum)类型值及字符串转换
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QMetaEnum利用Qt元数据实现枚举(enum)类型值及字符串转换 本文地址:ht ...
- 【leetcode】198.HouseRobber
198.HouseRobber You are a professional robber planning to rob houses along a street. Each house has ...
- PHP中普通属性和静态属性
普通属性(实例属性): 实例的单词为:instance 实例,其实也叫做“对象”: 普通(实例)属性,就是一个可以在该类实例化出的对象上使用的属性! 定义形式: class 类名{ var $属性 ...
- Android Studio 修改 包名
Android Studio上修改项目(module)的包名(Package Name) 当你对着包名右击,查找Refactor(重构)下的Rename(快捷键:SHIFT+F6)时,弹出来的仅仅 ...
- css 在背景图上加渐变
<html> <head> <title>我的第一个 HTML 页面</title> <style> .banner { width: %; ...
- SQL Server Management Studio(SSMS)的使用与配置整理
目录 目录 SQL Server Management Studio的使用与配置 1 设置SSMS显示行号 2 添加注释与取消注释的快捷键 3 新建查询的快捷键 4 开启sql语句TIME与IO的统计 ...
- 迁移数据到历史表SQL(转)
有时工作需要需要把当前表的数据,移到历史表中,而历史表基本是以时间(年)为后缀来命名历史表的,如 A_2011,A_2012,在移数据时,要按数据的时间,移到不同的表中,且由于如果数据有同步.一次处理 ...
- 洛谷 P2015 二叉苹果树
老规矩,先放题面 题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 我们用一根树枝两端 ...