标签:algorithm
codeforces 536 c Tavas and Pashmaks/*codeforces 536 c Tavas and Pashmaks 题意: 在一个运动比赛中有两种跑道,现在有n个选手,给出每个选手的在两种跑道上的速度,(ui,vi),求哪些选手可能赢得比赛。 限制: 1 <= n <= 2*1e5 思路: 维护一个类似凸包的一段。 */ #include<iostream> #include<cstdio> #include<queue> #include<algorithm> using namespace std; #define PB push_back const int N=2*1e5+5; struct Dt{ double x,y; int id; Dt(){} Dt(int _x,int _y,int _id){ x=_x; y=_y; id=_id; } bool operator < (const Dt t) const{ if(x==t.x){ return y<t.y; } return x<t.x; } }a[N]; priority_queue<Dt> q; int ans[N],cnt=0; vector<int> tab[N]; double xl[N]; void gao(Dt now){ if(cnt==0){ tab[cnt].PB(now.id); ans[cnt++]=now.id; return ; } double tmp; int pre=ans[cnt-1]; if(now.y==a[pre].y){ if(now.x==a[pre].x){ tab[cnt-1].PB(now.id); return ; } return ; } while(cnt>1){ pre=ans[cnt-1]; tmp=(now.x-a[pre].x)*now.y*a[pre].y/((a[pre].y-now.y)*a[pre].x*now.x); if(tmp<xl[pre]){ tab[cnt-1].clear(); --cnt; } else break; } pre=ans[cnt-1]; tmp=(now.x-a[pre].x)*now.y*a[pre].y/((a[pre].y-now.y)*a[pre].x*now.x); xl[now.id]=tmp; tab[cnt].PB(now.id); ans[cnt++]=now.id; } int main(){ int n; double u,v; scanf("%d",&n); for(int i=0;i<n;++i){ scanf("%lf%lf",&u,&v); a[i]=Dt(u,v,i); q.push(Dt(u,v,i)); } double _max=0; while(!q.empty()){ while(!q.empty() && q.top().y<_max){ q.pop(); } if(q.empty()) break; Dt now=q.top(); q.pop(); gao(now); _max=max(_max,now.y); } int cc=0; for(int i=0;i<cnt;++i){ for(int j=0;j<tab[i].size();++j){ ans[cc++]=tab[i][j]; } } sort(ans,ans+cc); for(int i=0;i<cc;++i){ printf("%d%c",ans[i]+1,i==cc-1?'\n':' '); } return 0; }
codeforces 536 c Tavas and Pashmaks
标签:algorithm
原文地址:http://blog.csdn.net/whai362/article/details/45100965