zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    MFC Windows 程序设计>WinMain 简单Windows程序 命令行编译
    AT3949 [AGC022D] Shopping 题解
    CF643D Bearish Fanpages 题解
    CF643C Levels and Regions 题解
    CF241E Flights 题解
    CF671C Ultimate Weirdness of an Array 题解
    CF1592F Alice and Recoloring 题解
    GYM 102452E 题解
    CF494C Helping People 题解
    P5556 圣剑护符
  • 原文地址:https://www.cnblogs.com/nofind/p/12173076.html
Copyright © 2011-2022 走看看