P2521 [HAOI2011]防线修建
Posted nofind
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P2521 [HAOI2011]防线修建相关的知识,希望对你有一定的参考价值。
题意
这道题的弱化版。
code:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+10;
const int maxm=1e5+10;
const int maxq=2e5+10;
const double eps=1e-8;
int m,Q;
double n,sx,sy,nowans;
bool vis[maxm];
struct Query{int op,x;double ans;}qr[maxq];
struct Point
{
double x,y;
inline double len(){return sqrt(x*x+y*y);}
Point operator+(const Point& a)const{return (Point){x+a.x,y+a.y};}
Point operator-(const Point& a)const{return (Point){x-a.x,y-a.y};}
Point operator*(const double& k){return (Point){x*k,y*k};}
Point operator/(const double& k){return (Point){x/k,y/k};}
double operator*(const Point& a)const{return x*a.y-y*a.x;}
double operator&(const Point& a)const{return x*a.x+y*a.y;}
}p[maxm];
inline int dcmp(double x)
{
if(fabs(x)<=eps)return 0;
return x<0?-1:1;
}
bool operator<(Point a,Point b){return a.x==b.x?a.y<b.y:a.x<b.x;}
set<Point>s;
inline void add(Point a)
{
set<Point>::iterator it1,it2;
it1=s.lower_bound(a);
it2=it1;it1--;
if(dcmp((a-*it1)*(*it2-a))>=0)return;
nowans-=(*it2-*it1).len();
it1=s.lower_bound(a);it2=it1;
if(it2!=s.end())
{
it2++;
while(it2!=s.end()&&dcmp((*it1-a)*(*it2-*it1))>=0)
{
nowans-=(*it2-*it1).len();
s.erase(it1);it1=it2;it2++;
}
}
it1=s.lower_bound(a);
it2=it1;it2--;
if(it2!=s.begin())
{
it2--,it1--;
while(it1!=s.begin()&&(*it1-a)*(*it2-*it1)<=0)
{
nowans-=(*it2-*it1).len();
s.erase(it1);it1=it2;
if(it2!=s.begin())it2--;
}
}
s.insert(a);
it1=it2=s.lower_bound(a);
it1--,it2++;
nowans+=(*it1-a).len()+(*it2-a).len();
}
int main()
{
scanf("%lf%lf%lf",&n,&sx,&sy);
scanf("%d",&m);
for(int i=1;i<=m;i++)scanf("%lf%lf",&p[i].x,&p[i].y);
scanf("%d",&Q);
for(int i=1;i<=Q;i++)
{
scanf("%d",&qr[i].op);
if(qr[i].op==1)scanf("%d",&qr[i].x),vis[qr[i].x]=1;
}
s.insert((Point){0,0});s.insert((Point){n,0});s.insert((Point){sx,sy});
nowans=((Point){sx,sy}).len()+((Point){n,0}-(Point){sx,sy}).len();
for(int i=1;i<=m;i++)if(!vis[i])add(p[i]);
for(int i=Q;i;i--)
if(qr[i].op==1)add(p[qr[i].x]);
else qr[i].ans=nowans;
for(int i=1;i<=Q;i++)if(qr[i].op==2)printf("%.2lf
",qr[i].ans);
return 0;
}
以上是关于P2521 [HAOI2011]防线修建的主要内容,如果未能解决你的问题,请参考以下文章
BZOJ2300[HAOI2011]防线修建 set维护凸包