【BZOJ 3190】 3190: [JLOI2013]赛车 (半平面交)
3190: [JLOI2013]赛车
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 20Sample Output
3
1 2 4HINT
对于100%的数据N<=10000, 0<=ki<=10^9, 0<=vi<=10^9
2016.1.17新加数据一组 By Nano_ape
Source
【分析】
时间作为x,路程作为y,有y=vx+st。
维护一个内部没有线的下凸壳即可。
实质上是简化版的半平面交,这题的直线有特殊形式,所以算起来更方便一些。
然后注意半平面交很重要的地方就是要学会特判去重,避免一些因为除以0 或者 乘负数没变号的错误。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
#define Maxn 10010 struct node {double st,v;int id;}t[Maxn];
struct P {double x,y;}; bool cmp(node x,node y) {return (x.v==y.v)?(x.st<y.st):(x.v<y.v);}
bool cmp2(int x,int y) {return t[x].id<t[y].id;} int ans[Maxn]; P inter(int a,int b)
{
P x;
x.x=(t[b].st-t[a].st)/(t[a].v-t[b].v);
x.y=t[a].st+t[a].v*x.x;
return x;
// printf("= =%lf %lf\n",x.x,x.y);
} bool jud(int a,int b,int c)
{
P x=inter(a,b);
// printf("= =%lf %lf\n",x.y,x.x*t[c].v);
return (x.y-t[c].st)<x.x*t[c].v;
} int main()
{
int n;
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%lf",&t[i].st);
for(int i=;i<=n;i++) scanf("%lf",&t[i].v);
for(int i=;i<=n;i++) t[i].id=i;
sort(t+,t++n,cmp);
int cnt=;
for(int i=;i<=n;i++)
{
while(t[i].st>t[cnt].st&&cnt>) cnt--;
t[++cnt]=t[i];
}
int tot=;
if(cnt<=)
{
printf("1\n%d\n",t[].id);
}
else
{
ans[++tot]=,ans[++tot]=;
for(int i=;i<=cnt;i++)
{
while(tot>=&&jud(ans[tot],ans[tot-],i)) tot--;
ans[++tot]=i;
}
sort(ans+,ans++tot,cmp2);
printf("%d\n",tot);
for(int i=;i<tot;i++) printf("%d ",t[ans[i]].id);
printf("%d",t[ans[tot]].id);
printf("\n");
}
return ;
}
2016-12-25 16:05:00
【BZOJ 3190】 3190: [JLOI2013]赛车 (半平面交)的更多相关文章
- bzoj 3190 [JLOI2013]赛车 半平面交+细节处理
题目大意 这里有一场赛车比赛正在进行,赛场上一共有N辆车,分别称为g1,g2--gn.赛道是一条无限长的直线.最初,gi位于距离起跑线前进ki的位置.比赛开始后,车辆gi将会以vi单位每秒的恒定速度行 ...
- 2018.07.04 BZOJ 2618 Cqoi2006凸多边形(半平面交)
2618: [Cqoi2006]凸多边形 Time Limit: 5 Sec Memory Limit: 128 MB Description 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n ...
- 【BZOJ 2618】 2618: [Cqoi2006]凸多边形 (半平面交)
2618: [Cqoi2006]凸多边形 Description 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n=2时,两个凸多边形如下图: 则相交部分的面积为5.233. Input 第一 ...
- bzoj 1038 [ZJOI2008]瞭望塔(半平面交)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1038 [题意] 找一个最低塔高使可以看到村庄的每一个角落. [思路] 半平面交 能够看 ...
- bzoj 2618 2618: [Cqoi2006]凸多边形(半平面交)
2618: [Cqoi2006]凸多边形 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 656 Solved: 340[Submit][Status] ...
- bzoj 2618: [Cqoi2006]凸多边形 [半平面交]
2618: [Cqoi2006]凸多边形 半平面交 注意一开始多边形边界不要太大... #include <iostream> #include <cstdio> #inclu ...
- BZOJ - 2618 凸多边形 (半平面交)
题意:求n个凸多边形的交面积. 半平面交模板题. #include<bits/stdc++.h> using namespace std; typedef long long ll; ty ...
- bzoj 2618 半平面交模板+学习笔记
题目大意 给你n个凸多边形,求多边形的交的面积 分析 题意\(=\)给你一堆边,让你求半平面交的面积 做法 半平面交模板 1.定义半平面为向量的左侧 2.将所有向量的起点放到一个中心,以中心参照进行逆 ...
- bzoj 1038 瞭望塔 半平面交+分段函数
题目大意 给你一座山,山的形状在二维平面上为折线 给出\((x_1,y_1),(x_2,y_2)...(x_n,y_n)\)表示山的边界点或转折点 现在要在\([x_1,x_n]\)(闭区间)中选择一 ...
随机推荐
- JSPatch 遇上swift
swift使用JSPatch要点: 继承自NSObject的Swift类,其继承自父类的方法具有动态性,其他自定义方法.属性需要加dynamic修饰才可以获得动态性(public属性除外) 例子可参看 ...
- 163免费邮客户端设置的POP3、SMTP、IMAP地址
网易邮箱支持POP3/SMTP/IMAP服务,方便您可以通过电脑客户端软件更好地收发邮件
- 关于css3 中filter的各种特效
做项目时遇到了一个有趣的css特效. 目前各大浏览器对于css3的兼容已经非常好了,最新版本都可以支持css3,老版本的ie9以下的还是不支持,不过这不是重点,微软都准备放弃这些老古董了. 现在规范中 ...
- 【leetcode】4. Median of Two Sorted Arrays
题目描述: There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of t ...
- 为oracle中的表格增加列和删除列
http://blog.csdn.net/rainharder/article/details/6663458 alter table 表名 drop column 列名eg:alter table ...
- .Net Core 中的包、元包与框架(Packages, Metapackages and Frameworks)
包,元包与框架 本文翻译自 Packages, Metapackages and Frameworks. .Net Core 是一种由 NuGet 包组成的平台.一些产品体验受益于代码包的细粒度定义, ...
- PDF编辑、删除、替换某页面或文字
在工作中,我们常常会用到PDF,当然尤其是会计,我虽然是程序员,但是“小老鼠”是会计,前几天,突然问我,怎么样将PDF中的某个页面替换掉,也就是删掉某页然后再从另外一个地方找一页补上来: 还需要改变这 ...
- 利用mysqld_multi启动管理多实例
利用mysqld_multi启动管理多实例 官方管理多实例的一个脚本peer #将之前的目录清空 [root@mysql01 mysql]# tree /data/mysql/ /data/mysql ...
- 修正 phpcmsv9 VIP过期日期为1970
打开 phpcms/modules/member/member.php 找到 $form_overdudate = form::date('info[overduedate]', date('Y-m- ...
- 浏览器兼容CSS代码:按钮文字垂直居中(input button text vertical align)
经过测试的浏览器:IE6, IE7, IE8, IE9, Firefox, Chrome, Safiri, Maxthon 按钮的HTML代码: <input id="btn_comm ...