zoukankan      html  css  js  c++  java
  • luogu P2510 [HAOI2008]下落的圆盘

    LINK:下落的圆盘

    计算几何。n个圆在平面上编号大的圆将编号小的圆覆盖求最后所有没有被覆盖的圆的边缘的总长度。

    在做这道题之前有几个前置知识。

    极坐标系:在平面内 由极点 极轴 和 极径组成的坐标系。

    如:在平面上取一点 O 叫做极点 从O出发引一条射线Ox 称为极轴。通常规定角度取逆时针方向为正。

    极角:在极坐标系中 平面上任何一点到极点的连线和极轴的夹角叫做极角。

    那么 我们可以发现极角的大小为0~360度(考虑正角。

    极角可以进行排序 由小到大的那种。

    那么对于平面上一个点(x,y)到极点的连线 和极轴x的夹角大小为 atan2(y/x).

    atan2指的tan的反函数是方位角 atan2 比 atan稳定 所以我们使用atan2.

    但是我们要求出极角来 这个返回的是方位角 如果当前角度为正 那么就是极角 如果为负 我们需要将其加上2pi 就变成极角了。

    接下来就可以做这道题了 首先考虑两圆相交如何求夹角?

    余弦定理+acos函数即可 n^2求交 然后我们发交的地方只算一次 所以可以利用极角来做。

    求出所有的极角之后 按极角排序 然后就是直线的覆盖问题。

    const int MAXN=1010;
    const double pi=acos(-1.0);
    struct wy
    {
    	db pl,pr;
    	bool operator <(const wy &a)const {return pl<a.pl;}
    }a[MAXN<<1];
    db x[MAXN],y[MAXN],r[MAXN],ans;
    int cnt,n;
    int main()
    {
    	freopen("1.in","r",stdin);
    	gt(n);
    	rep(1,n,i)gf(r[i]),gf(x[i]),gf(y[i]);
    	rep(1,n,i)
    	{
    		ans+=2*pi*r[i];
    		cnt=0;
    		rep(i+1,n,j)
    		{
    			db d=pf(x[i]-x[j])+pf(y[i]-y[j]);
    			if(pf(r[i]+r[j])<=d)continue;
    			if(pf(r[i]-r[j])>=d)
    			{
    				if(r[i]>r[j])continue;
    				else a[++cnt].pl=0,a[cnt].pr=2*pi;
    			}
    			else
    			{
    				db w=acos((pf(r[i])+d-pf(r[j]))/(2*r[i]*sqrt(d)));
    				db ww=atan2(y[j]-y[i],x[j]-x[i]);//方位角
    				if(ww<0)ww+=2*pi;++cnt;//极角
    				a[cnt].pl=ww-w;a[cnt].pr=ww+w;
    				if(a[cnt].pl<0)++cnt,a[cnt].pl=a[cnt-1].pl+2*pi,a[cnt-1].pl=0,a[cnt].pr=2*pi;
    				else if(a[cnt].pr>2*pi)++cnt,a[cnt].pr=a[cnt-1].pr-2*pi,a[cnt-1].pr=2*pi,a[cnt].pl=0;
    			}
    		}
    		sort(a+1,a+1+cnt);
    		db last=-1;
    		rep(1,cnt,j)
    		{
    			if(a[j].pr<=last)continue;
    			if(a[j].pl>last)ans-=(a[j].pr-a[j].pl)*r[i];
    			else ans-=(a[j].pr-last)*r[i];
    			last=a[j].pr;
    		}
    	}
    	printf("%.3lf
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    [PY3]——logging
    [PY3]——对iterator的处理(解析式、map、reduce、filter)
    php基础语法(文件加载和错误)
    php基础语法(控制语句、数组、函数)
    php基础语法(数据类型、运算符)
    php基础语法(变量)
    java基础语法
    ztree 获取根节点
    每天一个linux命令
    浅谈Web自适应
  • 原文地址:https://www.cnblogs.com/chdy/p/12570805.html
Copyright © 2011-2022 走看看