hdu 4736 This Is The Job The Bear Finds(2013年成都ACM网络赛)
// Time 1718 ms; Memory 1500 K
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define eps 1e-10
#define sqr(a) ((a)*(a))
#define pi (2.0*asin(1.0)) using namespace std; double ma[100010]; int sig(double a)
{
return (a>eps)-(a<-eps);
} typedef struct point
{
double x,y;
point(double xx=0,double yy=0):x(xx),y(yy){}
}vector; struct node
{
double ang,d;
point c;
}th[10010]; point pt[10010]; bool operator < (point a,point b)
{
return a.x<b.x || (a.x==b.x && a.y<b.y);
}
vector operator - (point a,point b)
{
return vector(a.x-b.x,a.y-b.y);
}
point operator + (point a,vector b)
{
return point(a.x+b.x,a.y+b.y);
}
vector operator * (vector a,double b)
{
return vector(a.x*b,a.y*b);
}
vector operator / (vector a,double b)
{
return vector(a.x/b,a.y/b);
}
double dot(vector a,vector b)
{
return a.x*b.x+a.y*b.y;
}
double cross(vector a,vector b)
{
return a.x*b.y-a.y*b.x;
}
double len(vector a)
{
return sqrt(sqr(a.x)+sqr(a.y));
}
double angle(vector a,vector b)
{
double d=dot(a,b)/len(a)/len(b);
if(sig(d-1)==0) return 0;
if(sig(d+1)==0) return pi;
return acos(d);
}
double dis(point a,point b,point p)
{
return fabs(cross(b-a,p-a))/len(b-a);
}
vector rot(vector a,double b)
{
double s=sin(b),c=cos(b);
return vector(a.x*c-a.y*s,a.x*s+a.y*c);
}
vector rsize(vector a,double b)
{
b/=len(a);
return vector(a.x*b,a.y*b);
}
point bcenter(int n,double &l)
{
point p,s;
double tp,area=0,tpx=0,tpy=0;
point t1=pt[0],t2=pt[0];
p=pt[0];
l=0;
for(int i=1;i<=n;i++)
{
s.x=pt[i==n ? 0 : i].x;
s.y=pt[i==n ? 0 : i].y;
if(s<t1) t1=s;
else if(t2<s) t2=s;
l+=len(pt[i-1]-s);
tp=cross(p,s);area+=tp/2;
tpx+=(p.x+s.x)*tp;tpy+=(p.y+s.y)*tp;
p.x=s.x;p.y=s.y;
}
if(sig(area)==0) s=(t1+t2)/2;
else
{
s.x=tpx/(6*area);s.y=tpy/(6*area);
}
return s;
}
point getp(point p,vector v,point cp,double r)
{
double a=v.x,b=p.x-cp.x,c=v.y,d=p.y-cp.y;
double e=sqr(a)+sqr(c),f=2*(a*b+c*d),g=sqr(b)+sqr(d)-sqr(r);
double del=sqr(f)-4*e*g;
double t=(-f+sqrt(del))/(2*e);
return p+v*t;
} int main()
{
int i,j,k,u,t,n,m,cnt,my,cas=1;
double l,sl,rad,lp,lq,ang1,ang2,ds,ll;
point ct,ct1,ct2,g;
vector v,w;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
my=0;
for(i=0;i<n;i++)
{
scanf("%lf%lf",&pt[i].x,&pt[i].y);
if(sig(pt[my].x-pt[i].x)>0) my=i;
}
scanf("%lf%lf%d",&ct.x,&ct.y,&m);
while(sig(cross(pt[my]-ct,pt[(my-1+n)%n]-pt[my]))>0) my=(my-1+n)%n;
g=bcenter(n,sl);
v=ct-g;
ll=len(v);
ct1=ct;
th[0].c=ct;
for(j=my,k=0;k<n;k++)
{
u=(j+k)%n;
lp=len(pt[u]-ct1);
ct2=getp(pt[u],pt[(u+1)%n]-pt[u],g,ll);
th[k+1].ang=th[k].ang+angle(ct1-g,ct2-g);
th[k+1].d=th[k].d+len(pt[u]-ct2)-lp;
th[k+1].c=ct2;
ct1=ct2;
}
for(i=0;i<m;i++)
{
scanf("%lf",&l);
cnt=(int)l/sl;
l=l-cnt*sl;
rad=cnt*2*pi;
int right=n,left=1,mid=(n+1)/2;
double tmp1,tmp2;
while(left<=right)
{
tmp1=l-th[mid].d;
tmp2=l-th[mid-1].d;
if(sig(tmp1)==0)
{
mid++;break;
}
if(sig(tmp2)==0) break;
if(sig(tmp1)<0 && sig(tmp2)>0)
break;
if(sig(tmp1)>0) left=mid+1;
else right=mid-1;
mid=(left+right)/2;
}
j=mid;
if(left>right) j++;
rad+=th[j-1].ang;
l-=th[j-1].d;
if(sig(l)>0)
{
u=(my+j-1)%n;
lp=len(pt[u]-g);
lq=len(th[j-1].c-pt[u])+l;
ang1=acos((sqr(lp)+sqr(ll)-sqr(lq))/(2*lp*ll));
ang2=ang1-angle(pt[u]-g,th[j-1].c-g);
rad+=ang2;
}
ma[i]=rad/pi*180;
}
printf("Case #%d:\n",cas++);
for(i=0;i<m;i++)
printf("%.3lf\n",ma[i]);
}
return 0;
}
hdu 4736 This Is The Job The Bear Finds(2013年成都ACM网络赛)的更多相关文章
- hdu 4741 Save Labman No.004 [2013年杭州ACM网络赛]
// Time 234 ms; Memory 244 K #include<iostream> #include<cstdio> #include<cmath> u ...
- hdu 4035 2011成都赛区网络赛E 概率dp ****
太吊了,反正我不会 /* HDU 4035 dp求期望的题. 题意: 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 从结点1出发,开始走,在每个结点i都有3种可能: 1.被杀死,回到结点 ...
- HDU 5901 Count primes (1e11内的素数个数) -2016 ICPC沈阳赛区网络赛
题目链接 题意:求[1,n]有多少个素数,1<=n<=10^11.时限为6000ms. 官方题解:一个模板题, 具体方法参考wiki或者Four Divisors. 题解:给出两种代码. ...
- hdu 4731 2013成都赛区网络赛 找规律
题意:找字串中最长回文串的最小值的串 m=2的时候暴力打表找规律,打表可以用二进制枚举
- hdu 4293 2012成都赛区网络赛 dp ****
题意:有n个人,可任意分成若干组,然后每个人个各提供一个信息,表示他们组前面有多少人,后面有多少人.问最多有多少个信息是不冲突的. 将n个人看成一组区间,然后每个人的信息可以表示为该人所在组的区间,然 ...
- hdu 4291 2012成都赛区网络赛 矩阵快速幂 ***
分析:假设g(g(g(n)))=g(x),x可能非常大,但是由于mod 10^9+7,所以可以求出x的循环节 求出x的循环节后,假设g(g(g(n)))=g(x)=g(g(y)),即x=g(y),y也 ...
- hdu 4031 2011成都赛区网络赛A题 线段树 ***
就是不知道时间该怎么处理,想了好久,看了别人的题解发现原来是暴力,暴力也很巧妙啊,想不出来的那种 -_-! #include<cstdio> #include<iostream&g ...
- hdu 4039 2011成都赛区网络赛I ***
两层搜索,直接for循环就行了,还要注意不能是自己的朋友 #include<cstdio> #include<iostream> #include<algorithm&g ...
- hdu 4038 2011成都赛区网络赛H 贪心 ***
贪心策略 1.使负数为偶数个,然后负数就不用管了 2.0变为1 3.1变为2 4.2变为3 5.若此时操作数剩1,则3+1,否则填个1+1,然后回到5
随机推荐
- type,isinstance判断一个变量的数据类型
type,isinstance判断一个变量的数据类型 import types type(x) is types.IntType # 判断是否int 类型 type(x) is types.Strin ...
- 宣布在 Azure 镜像库中正式推出 Windows Server 2012 R2 并降低 Windows Azure 的实例定价
我们今天将宣布两条消息,为使用基础结构服务的客户提供更多选择和成本节约:在镜像库中推出 Windows Server 2012 R2 以及降低 Memory Intensive 计算实例定价. 虚拟机 ...
- dojo 学习笔记
1 因为Dijit包括了一系列的UI组件,他绑定了4个支持的主题:nihilo, soria, tundra 和claro.每个主题包括了一系列的图片和CSS文件来控制组件的外观.CSS文件必须显示 ...
- AOP 面向切面编程、拦截器
AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术.它是一种新的方法论, ...
- Sicily-1063
一.题意 一个员工是另外一个员工的老板必须满足的条件是作为老板的员工的薪水salary必须大于这个员工,而且作为老板的员工的身高height要大于等于这个员工.首先按照薪水的多少从小到大进行排序,然后 ...
- Flex疑难小杂症
本文主要解决Flex中一些小问题,收集一些小技巧(来自网络及个人经验) flex自动换行问题 有时候由于label .button等控件中需要用到text属性显示出文本,文本太长就涉及到换行问题,解 ...
- Ajax概述及浅谈其与服务器的交互过程
概念: 首先AJAX不只是一个特定的客户端技术,更应算是一种技巧.Ajax技术的核心操作是用XmlHttpRequest(下称XHR)对象进行异步数据处理. 所谓异步,即通过 AJAX,JavaScr ...
- Android学习笔记(十四)——在执行时加入碎片(附源代码)
在执行时加入碎片 点击获取源代码 将UI切割为多个可配置的部分是碎片的优势之中的一个,但其真正强大之处在于可在执行时动态地把它们加入到活动中. 1.使用上一篇创建的Fragments项目,在main. ...
- asp.NET配置
添加用户 1.选择创建用户 2 可以使用网站管理工具来管理应用程序的所有安全设置.可以设置用户和密码(身份验证),可以创建角色(用户组),还可以创建权限(用于控制对应用程序各个部分的访问的规则). ...
- ubuntu14.04LTS ruby on rails 开发环境
小弟初学 Ruby,也没用过Linux. 在网上搜了好多关于开发环境的配置的文章,但总是和实际有点出入,找了N遍文章后,终于找到最简环境安装配置方法,分享下 推荐用 Ubuntu,感觉对于习惯用Win ...