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;
}
原文地址:https://www.cnblogs.com/nofind/p/12173076.html