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]防线修建的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 2300 HAOI2011 防线修建

cogs 547:[HAOI2011] 防线修建

BZOJ2300[HAOI2011]防线修建 set维护凸包

BZOJ 2300 2300: [HAOI2011]防线修建 (动态凸包+set)

bzoj2300HAOI2011防线修建

BZOJ 2300: [HAOI2011]防线修建|set维护凸壳