zoukankan      html  css  js  c++  java
  • bzoj 2300 : [HAOI2011]防线修建

    set动态维护凸包

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<set>
    #include<cmath>
    #define N 200005
    using namespace std;
    struct node
    {
    	int x,y;
    	node(){;}
    	node(int _x,int _y){x=_x;y=_y;}
    	friend bool operator < (const node &aa,const node &bb)
    	{
    		if(aa.x!=bb.x)return aa.x<bb.x;
    		return aa.y<bb.y;
    	}
    	friend node operator - (const node &aa,const node &bb)
    	{
    		return node(aa.x-bb.x,aa.y-bb.y);
    	}
    	friend int operator * (const node &aa,const node &bb)
    	{
    		return aa.x*bb.y-aa.y*bb.x;
    	}
    	friend bool operator == (const node &aa,const node &bb)
    	{
    		return aa.x==bb.x&&aa.y==bb.y;
    	}
    }q[N];
    double dis(node a,node b)
    {
    	return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
    }
    set<node>s;
    set<node>::iterator it,st,t1,t2;
    int n,xx,yy,m;
    bool v[N];
    int qr[N][2],cas;
    double now;
    double ans[N];
    void add(node p)
    {
    	it=s.lower_bound(p);
    	node suc=(*it);
    	if(suc==p)return ;
    	--it;st=it;
    	node pre=(*it);
    	if((p-suc)*(pre-suc)<=0)return ;
    	now-=dis(suc,pre);
    	it=s.lower_bound(p);
    	t1=it;++it;
    	while(it!=s.end())
    	{
    		if((*t1-p)*(*it-p)<0)break;
    		now-=dis(*it,*t1);
    		s.erase(t1);
    		t1=it;++it;
    	}
    	while(st!=s.begin())
    	{
    		t2=st;--st;
    		if((*t2-p)*(*st-p)>0)break;
    		now-=dis(*t2,*st);
    		s.erase(t2);
    	}
    	s.insert(p);
    	it=st=s.find(p);
    	it--;st++;
    	now+=dis(*it,p);now+=dis(*st,p);
    	return ;
    }
    int main()
    {
    	scanf("%d%d%d",&n,&xx,&yy);
    	s.insert(node(n,0));s.insert(node(0,0));
    	s.insert(node(xx,yy));
    	now+=dis(node(xx,yy),node(n,0));
    	now+=dis(node(xx,yy),node(0,0));
    	scanf("%d",&m);
    	for(int i=1;i<=m;i++)scanf("%d%d",&q[i].x,&q[i].y);
    	scanf("%d",&cas);
    	for(int i=1;i<=cas;i++)
    	{
    		scanf("%d",&qr[i][0]);
    		if(qr[i][0]==1)
    		{
    			scanf("%d",&qr[i][1]);
    			v[qr[i][1]]=1;
    		}
    	}
    	for(int i=1;i<=m;i++)
    	{
    		if(!v[i])add(q[i]);
    	}
    	for(int i=cas;i>=1;i--)
    	{
    		if(qr[i][0]==2)
    		{
    			ans[i]=now;
    		}
    		else 
    		{
    			add(q[qr[i][1]]);
    		}
    	}
    	for(int i=1;i<=cas;i++)
    	{
    		if(qr[i][0]==2)printf("%.2f
    ",ans[i]);
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    React开发实时聊天招聘工具 -第六章 登陆注册(2)
    React开发实时聊天招聘工具 -第六章 登陆注册(1)
    温习 socket http tcp
    高阶组件简介
    计算机组成原理(7)——输入、输出系统
    计算机组成原理(6)——总线
    计算机组成原理(5)——中央处理器
    计算机组成原理(4)——指令系统
    计算机组成原理(3)——存储层次结构
    计算机组成原理(2)——数据的表示与运算
  • 原文地址:https://www.cnblogs.com/ezyzy/p/6783042.html
Copyright © 2011-2022 走看看