记录编号 |
485402 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[HNOI 2012]射箭 |
最终得分 |
100 |
用户昵称 |
LadyLex |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.753 s |
提交时间 |
2018-01-31 13:39:49 |
内存使用 |
27.02 MiB |
显示代码纯文本
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #include <cmath>
- using namespace std;
- #define N 100010
- #define db double
- db x[N],yy[N],y2[N];
- struct Vector
- {
- db x,y;
- Vector(db a=0,db b=0){x=a,y=b;}
- inline Vector operator + (const Vector &b)const {return Vector(x+b.x,y+b.y);}
- inline Vector operator - (const Vector &b)const {return Vector(x-b.x,y-b.y);}
- inline db operator * (const Vector &b)const {return x*b.y-b.x*y;}
- inline Vector operator * (const db &b)const {return Vector(x*b,y*b);}
- }p[N];
- struct line
- {
- Vector s,t,v;db k;int id;
- }l[N<<1],q[N<<1];int hd,tl;
- inline bool mt (const line &a,const line &b)
- {
- if(a.k!=b.k)return a.k<b.k;
- return (b.t-a.s)*a.v>0;
- }
- inline bool overwatch(Vector a,line b){return (b.s-a)*(b.t-a)<0;}
- inline Vector cross(line a,line b)
- {
- db l1=(a.t-b.s)*b.v,l2=b.v*(a.s-b.s);
- return a.s+a.v*(l2/(l1+l2));
- }
- int len;
- inline void solve(int le,int r)
- {
- if(le==r){printf("%d\n",le);return;}
- register int mi=(le+r)>>1,i,last=1;
- hd=1,tl=0;
- for(i=1;i<=len;++i)
- if(l[i].id<=mi+1)
- {
- while(hd<tl&&overwatch(cross(q[tl],q[tl-1]),l[i]))--tl;
- while(hd<tl&&overwatch(cross(q[hd],q[hd+1]),l[i]))++hd;
- q[++tl]=l[i];
- }
- while(hd<tl&&overwatch(cross(q[tl],q[tl-1]),q[hd]))--tl;
- tl-hd>1?solve(mi+1,r):solve(le,mi);
- }
- char B[1<<15],*S=B,*T=B;
- #define getc ((S==T)&&(T=(S=B)+fread(B,1,1<<15,stdin),S==T)?0:*S++)
- inline int read()
- {
- int x=0;register char c=getc;
- while(c<'0'|c>'9')c=getc;
- while(c>='0'&c<='9')x=10*x+(c^48),c=getc;
- return x;
- }
- int main()
- {
- // freopen("Ark.in","r",stdin);
- freopen("bzoj_2732.in","r",stdin);
- freopen("bzoj_2732.out","w",stdout);
- register int i,j,cnt,n;
- n=read();
- for(i=1;i<=n;++i)
- x[i]=read(),yy[i]=read(),y2[i]=read();
- for(i=1;i<=n;++i)
- {
- l[i].s=Vector(0,yy[i]/x[i]);
- l[i].v=Vector(1,-x[i]);
- l[i].t=l[i].s+l[i].v;
- l[i].k=atan2(l[i].v.y,l[i].v.x);
- l[i].id=i;
- l[i+n].s=Vector(0,y2[i]/x[i]);
- l[i+n].v=Vector(-1,x[i]);
- l[i+n].t=l[i+n].s+l[i+n].v;
- l[i+n].k=atan2(l[i+n].v.y,l[i+n].v.x);
- l[i+n].id=i;
- }
- len=n<<1;
- l[++len].s=Vector(0,0),l[len].v=Vector(0,1),l[len].t=Vector(0,1),l[len].k=atan2(1,0);l[len].id=0;
- l[++len].s=Vector(0,0),l[len].v=Vector(1,0),l[len].t=Vector(1,0),l[len].k=atan2(0,1);l[len].id=0;
- sort(l+1,l+len+1,mt);
- for(cnt=1,i=2;i<=len;++i)
- if(l[i].k!=l[cnt].k)l[++cnt]=l[i];
- len=cnt;
- solve(1,n);
- }