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
随机推荐
- Json.Net系列教程 3.Json.Net序列化和反序列化设置
原文 Json.Net系列教程 3.Json.Net序列化和反序列化设置 上节补充 首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framewo ...
- Ubuntu系统下在Eclipse中使用真实手机运行调试Android应用
本文是在Ubuntu下已搭建好JRE+Eclipse+AndroidSDK的环境中进行的. 如果从未进行过如下的操作的话,在运行Android应用时,在设备选择器那里你的手机会显示为一大串" ...
- 46. Lotus Notes中编程发送邮件(一)
邮件是Lotus Notes体系的核心和基本功能,以至于Send()是NotesDocument的一个方法,任何一个文档都可以被发送出去,Notes里的一封邮件也只是一个有一些特殊字段的文档.在程序开 ...
- Linux下shell编程实例
1. 推断一文件是不是块或字符设备文件.假设是将其复制到 /dev 文件夹下 read -p "input a file:" filename if [ -b $filename ...
- SQL执行效率总结
1.关于SQL查询效率,100w数据,查询只要1秒,与您分享: 机器情况 p4: 2.4 内存: 1 G os: windows 2003 数据库: ms sql server 2000 目的: 查询 ...
- C# Code Snip
1.Tryf + TAB+TAB try { } finally { } 2.Prop+Tab+Tab public int MyProperty { get; set; } 3. #region + ...
- 关于java项目导入,所碰到的版本问题
怎么修改myeclipse 项目中用的jdk版本 工具/原料 MyEclipse java项目 方法/步骤 首先打开MyEclipse,如下图所示 打开之后,找到我们的java项目 然后右键-- ...
- STL之list(双向链表)
一,概述 List将元素按顺序储存在链表中. 与向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢. list 不仅是一个双向链表,而且是一个环状双向链表 二,使用 #incl ...
- BZOJ 1612: [Usaco2008 Jan]Cow Contest奶牛的比赛( floyd )
对于第 i 头牛 , 假如排名比它高和低的数位 n - 1 , 那么他的 rank 便可以确定 . floyd -------------------------------------------- ...
- LNMP一键安装结果
============================== Check install ============================== Checking ... Nginx: OK M ...