3190: [JLOI2013]赛车

Time Limit: 10 Sec  Memory Limit: 128 MB

Submit: 1445  Solved: 454

[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

计算几何,维护一个y轴右面的半平面交。

注意两个赛车速度和起始状态都同样的情况。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<vector>
#define F(i,j,n) for(int i=j;i<=n;i++)
#define D(i,j,n) for(int i=j;i>=n;i--)
#define ll long long
#define maxn 10005
#define eps 1e-8
using namespace std;
int n,top,ans[maxn],f[maxn];
struct car{int p,v,id;}a[maxn],s[maxn];
vector<int> v[maxn];
inline int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
inline bool cmp(car x,car y)
{
return (x.v==y.v)?x.p>y.p:x.v<y.v;
}
inline double cross(car x,car y)
{
return (double)(x.p-y.p)/(y.v-x.v);
}
int main()
{
n=read();
F(i,1,n) a[i].p=read();
F(i,1,n) a[i].v=read();
F(i,1,n) a[i].id=i,f[i]=i;
sort(a+1,a+n+1,cmp);
s[++top]=a[1];
F(i,2,n)
{
if (a[i].v==a[i-1].v)
{
if (a[i].p==a[i-1].p)
{
v[f[a[i-1].id]].push_back(a[i].id);
f[a[i].id]=f[a[i-1].id];
}
continue;
}
while (top>=2&&cross(s[top],s[top-1])>cross(s[top-1],a[i])) top--;
while (top>=1&&cross(s[top],a[i])<-eps) top--;
s[++top]=a[i];
}
F(i,1,top) ans[i]=s[i].id;
int tt=top;
F(i,1,tt) for(int j=0;j<v[ans[i]].size();j++) ans[++top]=v[ans[i]][j];
sort(ans+1,ans+top+1);
printf("%d\n",top);
F(i,1,top-1) printf("%d ",ans[i]);
printf("%d\n",ans[top]);
return 0;
}

bzoj3190【JLOI2013】赛车的更多相关文章

  1. BZOJ3190[JLOI2013]赛车

    Description 这里有一辆赛车比赛正在进行,赛场上一共有N辆车,分别称为个g1,g2--gn.赛道是一条无限长的直线.最初,gi位于距离起跑线前进ki的位置.比赛开始后,车辆gi将会以vi单位 ...

  2. BZOJ-3190 [JLOI2013]赛车

    转成二元一次不等式组,然后半平面交. #include <cstdlib> #include <cstdio> #include <cmath> #include ...

  3. 【BZOJ3190】[JLOI2013]赛车 单调栈+几何

    [BZOJ3190][JLOI2013]赛车 Description 这里有一辆赛车比赛正在进行,赛场上一共有N辆车,分别称为个g1,g2……gn.赛道是一条无限长的直线.最初,gi位于距离起跑线前进 ...

  4. 【BZOJ 3190】 3190: [JLOI2013]赛车 (半平面交)

    3190: [JLOI2013]赛车 Description 这里有一辆赛车比赛正在进行,赛场上一共有N辆车,分别称为个g1,g2--gn.赛道是一条无限长的直线.最初,gi位于距离起跑线前进ki的位 ...

  5. bzoj 3190 [JLOI2013]赛车 半平面交+细节处理

    题目大意 这里有一场赛车比赛正在进行,赛场上一共有N辆车,分别称为g1,g2--gn.赛道是一条无限长的直线.最初,gi位于距离起跑线前进ki的位置.比赛开始后,车辆gi将会以vi单位每秒的恒定速度行 ...

  6. P3256 [JLOI2013]赛车

    传送门 如果把速度看成斜率,起始位置看成截距,这就是一个水平可见直线了-- 不过这题里我实现方法借鉴了CQzhangyu大佬的,先按速度排序,然后维护一个单调栈,如果当前的人速度比栈顶大距离又比它远直 ...

  7. 【bzoj5089】最大连续子段和 分块+单调栈维护凸包

    题目描述 给出一个长度为 n 的序列,要求支持如下两种操作: A  l  r  x :将 [l,r] 区间内的所有数加上 x : Q  l  r : 询问 [l,r] 区间的最大连续子段和. 其中,一 ...

  8. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  9. 刷题总结——赛车(bzoj3190)

    题目: 题目背景 JLOI2013 T1 题目描述 这里有一辆赛车比赛正在进行,赛场上一共有 N 辆车,分别称为 g1,g2,……,gn.赛道是一条无限长的直线.最初,gi 位于距离起跑线前进 ki  ...

随机推荐

  1. Codeforces_B.Maximum Sum of Digits

    http://codeforces.com/contest/1060/problem/B 题意:将n拆为a和b,让a+b=n且S(a)+S(b)最大,求最大的S(a)+S(b). 思路:考虑任意一个数 ...

  2. CREATE TRIGGER - 定义一个新的触发器

    SYNOPSIS CREATE TRIGGER name { BEFORE | AFTER } { event [ OR ... ] } ON table [ FOR [ EACH ] { ROW | ...

  3. bat copy

    @echo off regedit /s %~dp0regedit.reg                                          //注册注册表xcopy "D: ...

  4. CAD参数绘制线型标注(网页版)

    主要用到函数说明: _DMxDrawX::DrawDimRotated 绘制一个线型标注.详细说明如下: 参数 说明 DOUBLE dExtLine1PointX 输入第一条界线的起始点X值 DOUB ...

  5. phphstrom改变项目中文件排列方式

    1.View>Tool Win dows>Project 效果图: 2.File->settings (Ctrl+Alt+S)-> Editor->General-> ...

  6. ehcache的学习笔记(一)

    学习ehcache文档: 介绍:Ehcache是一个开源的项目,用来提高性能的基于标准化的缓存,无需使用数据库,简化了可扩展性.他是最广泛使用的基于java的缓存,因为他是强壮的,被证实的,功能全面的 ...

  7. 20Spring切面的优先级

    通过使用@order注解指定切面的优先级,值越小,优先级越高代码: package com.cn.spring.aop.impl; //加减乘除的接口类 public interface Arithm ...

  8. Django之初

    Django之初 Django的开始: #安装Django: pip3 install django #创建Django项目: django-admin startproject 项目名 #比如: d ...

  9. 洛谷 4933 洛谷10月月赛II T2 大师

    [题解] f[i][j]表示最后一个数为h[i],公差为j的等差数列的个数.n方枚举最后一个数和倒数第二个数转移即可.注意公差可能为负数,需要移动为正数再作为下标. #include<cstdi ...

  10. Uva 12657 移动盒子(双向链表)

    题意: 你有一行盒子,从左到右依次编号为1, 2, 3,…, n.可以执行以下4种指令:1 X Y表示把盒子X移动到盒子Y左边(如果X已经在Y的左边则忽略此指令).2 X Y表示把盒子X移动到盒子Y右 ...