BZOJ_P3190 [JLOI2013]赛车(计算几何+单调栈)
2016-02-20 13:58
381 查看
BZOJ传送门
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 1203 Solved: 385
[Submit][Status][Discuss]
Description
这里有一辆赛车比赛正在进行,赛场上一共有N辆车,分别称为个g1,g2……gn。赛道是一条无限长的直线。最初,gi位于距离起跑线前进ki的位置。比赛开始后,车辆gi将会以vi单位每秒的恒定速度行驶。在这个比赛过程中,如果一辆赛车曾经处于领跑位置的话(即没有其他的赛车跑在他的前面),这辆赛车最后就可以得奖,而且比赛过程中不用担心相撞的问题。现在给出所有赛车的起始位置和速度,你的任务就是算出那些赛车将会得奖。
Input
第一行有一个正整数N表示赛车的个数。
接下来一行给出N个整数,按顺序给出N辆赛车的起始位置。
再接下来一行给出N个整数,按顺序给出N辆赛车的恒定速度。
Output
输出包括两行,第一行为获奖的赛车个数。
第二行按从小到大的顺序输出获奖赛车的编号,编号之间用空格隔开,注意最后一个编号后面不要加空格。
Sample Input
4
1 1 0 0
15 16 10 20
Sample Output
3
1 2 4
HINT
对于100%的数据N<=10000, 0<=ki<=10^9, 0<=vi<=10^9
2016.1.17新加数据一组 By Nano_ape
Source
这道题一看就是水平可见直线BZOJP1007,在前面我也写过题解,这道题有两点需要注意
1.赛车同时并列都算!
2.交点<0的要删去
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 1203 Solved: 385
[Submit][Status][Discuss]
Description
这里有一辆赛车比赛正在进行,赛场上一共有N辆车,分别称为个g1,g2……gn。赛道是一条无限长的直线。最初,gi位于距离起跑线前进ki的位置。比赛开始后,车辆gi将会以vi单位每秒的恒定速度行驶。在这个比赛过程中,如果一辆赛车曾经处于领跑位置的话(即没有其他的赛车跑在他的前面),这辆赛车最后就可以得奖,而且比赛过程中不用担心相撞的问题。现在给出所有赛车的起始位置和速度,你的任务就是算出那些赛车将会得奖。
Input
第一行有一个正整数N表示赛车的个数。
接下来一行给出N个整数,按顺序给出N辆赛车的起始位置。
再接下来一行给出N个整数,按顺序给出N辆赛车的恒定速度。
Output
输出包括两行,第一行为获奖的赛车个数。
第二行按从小到大的顺序输出获奖赛车的编号,编号之间用空格隔开,注意最后一个编号后面不要加空格。
Sample Input
4
1 1 0 0
15 16 10 20
Sample Output
3
1 2 4
HINT
对于100%的数据N<=10000, 0<=ki<=10^9, 0<=vi<=10^9
2016.1.17新加数据一组 By Nano_ape
Source
这道题一看就是水平可见直线BZOJP1007,在前面我也写过题解,这道题有两点需要注意
1.赛车同时并列都算!
2.交点<0的要删去
#include<cstdio> #include<algorithm> #include<iostream> using namespace std; #define N 10005 #define eps 0.000000000000001 int n,top; struct Car{ int v,g,id; bool operator == (const Car x)const{return v==x.v;} inline double getk(Car x){return double(x.g-g)/double(v-x.v);} }c ,stk ; int cmp1(Car x,Car y){return x.v<y.v||(x.v==y.v&&x.g<y.g);} int cmp2(Car x,Car y){return x.id<y.id;} inline int in(){ int x=0;char ch=getchar();while(ch>'9'||ch<'0') ch=getchar(); while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();return x; } int main(){ n=in(); for(register int i=1;i<=n;i++) c[i].g=in(),c[i].id=i; for(register int i=1;i<=n;i++) c[i].v=in(); sort(c+1,c+n+1,cmp1);top=1; for(register int i=2;i<=n;i++){ if(c[i].v!=c[i-1].v||(c[i].v==c[i-1].v&&c[i].g==c[i-1].g)) top++; c[top]=c[i]; } n=top,top=0;stk[++top]=c[1]; for(register int i=2;i<=n;i++){ while(top>0&&stk[top].getk(c[i])<-eps) top--; while(top>1&&stk[top].getk(stk[top-1])>stk[top].getk(c[i])) top--; stk[++top]=c[i]; } printf("%d\n",top); sort(stk+1,stk+top+1,cmp2); for(register int i=1;i<=top;i++) printf("%d%c",stk[i].id," \n"[i==top]); return 0; }
相关文章推荐
- 冒泡排序
- hdu2196树形dp+邻接表
- 异常
- 深入理解display属性
- 【转】在Win7的IIS上搭建FTP服务及用户授权
- 冒泡排序
- C++中类的多态与虚函数的使用
- 带返回值的存储过程
- Python——类代码编写细节
- 用shell脚本执行mysql语句
- 从 Android 静音看正确的查找 bug 的姿势
- iOS 自定义UITableViewCell中button事件处理
- AngularJS的启动过程分析
- hdu 1019 Least Common Multiple
- AngularJS与其他框架的不同
- linux字符驱动之中断按键
- 系统实现理念
- Android的IPC机制(一)——AIDL的使用
- VSFTP上传不了
- 就职意向