【JLOI2013】赛车(半平面交)

传送门


题解:

很显然的半平面交,需要注意几个细节。

首先三线交于一点的时候中间那个点不能弹,然后重合的直线显然结果是相同的,再就是必须在第一象限。

由于给的就是解析式,直接用解析式做半平面交就行了,我的写法没有用double


代码:

#include<bits/stdc++.h>
#define ll long long
#define re register
#define cs const

using std::cerr;
using std::cout;

cs int N=2e4+7; 
int k[N],b[N],id[N],st[N],tp;
bool cov(int i,int j){
	return k[j]>=k[i]&&b[j]>b[i];
}
bool judge(int x,int y,int z){
	return (ll)(k[z]-k[y])*(b[x]-b[z])>(ll)(k[z]-k[x])*(b[y]-b[z]);
}
bool cmp(int i,int j){
	return k[i]<k[j]||(k[i]==k[j]&&b[i]<b[j]);
}

int n;
void Main(){
	scanf("%d",&n);
	for(int re i=1;i<=n;++i)scanf("%d",b+i);
	for(int re i=1;i<=n;++i)scanf("%d",k+i);
	for(int re i=1;i<=n;++i)id[i]=i;
	std::sort(id+1,id+n+1,cmp);
	for(int re i=1;i<=n;++i){
		while(tp&&cov(st[tp],id[i]))--tp;
		while(tp>1&&judge(st[tp-1],st[tp],id[i]))--tp;
		st[++tp]=id[i];
	}std::sort(st+1,st+tp+1);std::cout<<tp<<"\n";
	for(int re i=1;i<=tp;++i)std::cout<<st[i]<<" ";
}

void file(){
#ifdef zxyoi 
	freopen("race.in","r",stdin);
#endif
}
signed main(){file();Main();return 0;}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值