对于一辆赛车,速度vi,位置ki,转化为一次函数yi=vix+ki。然后画出y1,y2,...y3的图像,然后可以发现,gi处于领先当且仅当yi=vix+ki在某一时刻是最大的(并列也算)。
然后就相当于n个半平面求半平面交了。。。
注意在x轴左侧的直线需要去掉。
然后过了所有原题数据。。但是bzoj上狂WA不止T_T为什么新加的数据这么强。。。
扒了一下黄学长的博客。。发现写的好简单啊。。。然后就照着那种写下来辣!
然后就A了o(╯□╰)o。。。至今不知道错在哪T_T大概是太弱了吧T_T。
AC代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 10005
using namespace std;
struct line{ double k,b; int id; }a[N],q[N]; int n,cnt,ans[N];
double itr_x(line x,line y){ return (y.b-x.b)/(x.k-y.k); }
bool cmp(line x,line y){ return x.k<y.k || x.k==y.k && x.b>y.b; }
int main(){
scanf("%d",&n); int i;
for (i=1; i<=n; i++) scanf("%lf",&a[i].b);
for (i=1; i<=n; i++) scanf("%lf",&a[i].k);
for (i=1; i<=n; i++) a[i].id=i; sort(a+1,a+n+1,cmp);
cnt=1;
for (i=2; i<=n; i++)
if (a[i].k!=a[cnt].k || a[i].k==a[cnt].k && a[i].b==a[cnt].b)
a[++cnt]=a[i];
q[n=1]=a[1]; ans[1]=a[1].id;
for (i=2; i<=cnt; i++){
while (n && itr_x(q[n],a[i])<0) n--;
while (n>1 && itr_x(q[n-1],q[n])>itr_x(q[n-1],a[i])) n--;
q[++n]=a[i]; ans[n]=a[i].id;
}
printf("%d\n",n); sort(ans+1,ans+n+1);
for (i=1; i<n; i++) printf("%d ",ans[i]); printf("%d\n",ans[n]);
return 0;
}
by lych
2016.3.2