BZOJ2300: [HAOI2011]防线修建

来源:互联网 发布:儿童网络学英语 编辑:程序博客网 时间:2024/04/30 15:06

每次删一个点或询问剩余点的凸包周长


删一个点好麻烦呀,考虑离线,倒着操作将删点改为加点
然后就简单了,用一颗平衡树维护凸包中的点,倒着把点加回去
splay可以用set
论熟练运用STL


code:

#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#include<ctime>#include<bitset>#include<string>#include<vector>#include<cstdio>#include<cstdlib>#include<cstring>#include<climits>#include<complex>#include<iostream>#include<algorithm>#define inf 1e9using namespace std;const int maxn = 110000;struct node{    int x,y;    node(){}    node(int _x,int _y){x=_x;y=_y;}}a[maxn],up,zero; int n;int mul(node x,node y){    return x.x*y.y-x.y*y.x;}int multi(node x,node y,node z){    x.x-=z.x; x.y-=z.y;    y.x-=z.x; y.y-=z.y;    return x.x*y.y-x.y*y.x;}bool judge(node x,node y){ return x.x==y.x&&x.y==y.y; }bool operator <(node x,node y){    return mul(x,y)>0||(mul(x,y)==0&&x.x<y.x);}double dis(node x,node y){    double x1=x.x-y.x,y1=x.y-y.y;    return sqrt((x1*x1)+(y1*y1));}stack<double> T;bool vis[maxn];int q[maxn];int m;double ret;set<node>S;set<node>::iterator it;void ins(node x){    it=S.lower_bound(x);    set<node>::iterator l,r,ll,rr;    r=it;    it--; l=it;    if(mul(*r,x)==0) return ;    if(judge(*r,up))    {        ll=l; ll--;        if(multi(*l,*ll,x)<0)        {            S.insert(x);            ret+=dis(zero,x)+dis(x,*l)-dis(zero,*l);            return ;        }        ret-=dis(zero,*l);        for(;!judge(*ll,zero);l=ll,ll--)        {            if(multi(*l,*ll,x)<0) break;            ret-=dis(*l,*ll);            S.erase(*l);        }        S.insert(x);        ret+=dis(x,zero)+dis(x,*l);        return ;    }    if(multi(x,*r,*l)<=0) return ;    ret-=dis(*l,*r);    for(rr=r,rr++;!judge(*rr,up);r=rr,rr++)    {        if(multi(*r,*rr,x)>0) break;        ret-=dis(*r,*rr);        S.erase(*r);    }    ret+=dis(x,*r);    for(ll=l,ll--;!judge(*ll,zero);l=ll,ll--)    {        if(multi(*l,x,*ll)>0) break;        ret-=dis(*l,*ll);        S.erase(*l);    }    ret+=dis(x,*l);    S.insert(x);}int main(){    int x,y,c; scanf("%d%d%d",&c,&x,&y);    node zero=node(0,0); S.insert(zero);    node a2=node(c,0); S.insert(a2);    node a3=node(x,y); S.insert(a3);    up=node(0,1);    S.insert(up);    ret=dis(a2,a3)+dis(zero,a3);    scanf("%d",&n);    for(int i=1;i<=n;i++)    {        scanf("%d%d",&x,&y);        a[i]=node(x,y);    }    scanf("%d",&m);    for(int i=1;i<=m;i++)    {        scanf("%d",&x);        if(x==2) q[i]=0;        else scanf("%d",&q[i]),vis[q[i]]=true;    }    for(int i=1;i<=n;i++) if(!vis[i]) ins(a[i]);    for(int i=m;i>=1;i--)    {        if(!q[i]) T.push(ret);        else ins(a[q[i]]);    }    while(!T.empty()) printf("%.2lf\n",T.top()),T.pop();    return 0;}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 当发生噩梦、梦魇等情况时该怎么办 出车祸后全保对方在家里来闹怎么办 轮胎正面凹槽被划了口子怎么办 机票已经买完了护照丢了怎么办 买完机票后护照丢了怎么办 填简历时籍贯写了汉怎么办 深圳公租房住满5年后怎么办 深圳公租房住满6年后怎么办 没单位了个人不想交社保怎么办 北京公租房住满5年后怎么办 部落冲突怎样看账号密码忘了怎么办 摩托车闯红灯4次扣24分怎么办 星巴克金星级会员到期了怎么办 2018年驾照到期换证色弱怎么办 怀孕5个月咳嗽有痰怎么办 广州驾照换证体检视力不过怎么办 驾照12分扣完了怎么办费用标准 驾照体检出绿色盲不能补证怎么办 在交警队驾驶员陈述笔录写错怎么办 学驾照做体检把电话填错了怎么办 驾考中心考场停考预约的考试怎么办 口令卡绑定第一次身份证输错怎么办 第一次去医院看病没带身份证怎么办 考科目二紧张怎么办如何消除紧张 考科目三紧张怎么办如何消除紧张 我的驾考准考证和发票丢了怎么办 科目二预约考试下一步点不了怎么办 护士资格证未注册过期没注册怎么办 上海护士延续体检有乙肝携带怎么办 护士资格证从诊所变更到医院怎么办 杭州驾考预约面授没有去怎么办 在外地考的驾驶证丢了怎么办 身份证和驾驶证在外地丢了怎么办 我有摩e照学c1照怎么办 科三网上预约超过了次数限制怎么办 驾照罚款没交过了周期怎么办 驾照考了科科目一想换个驾校怎么办 韩国货物被机场海关扣了怎么办 车管所查不到居住证信息怎么办 高中毕业两年了想考大学怎么办 我买的二手货车营运证是假的怎么办