bzoj3190 赛车 半平面交

       对于一辆赛车,速度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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值