bzoj 3190 [JLOI2013]赛车 半平面交+细节处理
题目大意
这里有一场赛车比赛正在进行,赛场上一共有N辆车,分别称为g1,g2……gn。赛道是一条无限长的直线。最初,gi位于距离起跑线前进ki的位置。比赛开始后,车辆gi将会以vi单位每秒的恒定速度行驶。在这个比赛过程中,如果一辆赛车曾经处于领跑位置的话(即没有其他的赛车跑在他的前面),这辆赛车最后就可以得奖,而且比赛过程中不用担心相撞的问题。现在给出所有赛车的起始位置和速度,你的任务就是算出那些赛车将会得奖。
分析
一辆车的函数就是\(f_i(x)=k_i x +b_i\)
那题目就是要使得有一时刻\(f_i(x)\)下面有所有\(f_j(x)\)
那么就有一个性质:
一向量\(x\)在某段时间在另一向量\(y\)的左边,那么这段时间\(x\)领先
那么就有曾经领先在所有车前面的赛车
它的函数出现在半平面交上
注意
细节挺多的
1.函数中有一个点在半平面交上也算进答案
2.重边要特判
所以先排好序,算好重边,加个vector,再跑半平面交,比较好写些
solution
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <algorithm>
#include <vector>
using namespace std;
typedef double db;
const int M=10007;
inline int rd(){
int x=0;;bool f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-')f=0;
for(;isdigit(c);c=getchar()) x=x*10+c-48;
return f?x:-x;
}
struct pt{
db x,y;
pt(db xx=0.0,db yy=0.0){x=xx;y=yy;}
};
pt operator +(pt x,pt y){return pt(x.x+y.x,x.y+y.y);}
pt operator -(pt x,pt y){return pt(x.x-y.x,x.y-y.y);}
pt operator *(pt x,db d){return pt(x.x*d,x.y*d);}
pt operator /(pt x,db d){return pt(x.x/d,x.y/d);}
db dot(pt x,pt y){return x.x*y.x+x.y*y.y;}
db det(pt x,pt y){return x.x*y.y-x.y*y.x;}
db len(pt x){return sqrt(dot(x,x));}
db dis(pt x,pt y){return len(y-x);}
db area(pt x,pt y,pt z){return det(y-x,z-x);}
struct line{
pt P,v;
int cnt;
line(pt PP=pt(),pt vv=pt(),int cc=0){P=PP;v=vv;cnt=cc;}
}l[M],s[M];
int top;
bool ptright(pt x,line y){return det(y.v,x-y.P)<0;}//<0因为在半平面上的点也能算进答案里面
bool parallel(line x,line y){return det(x.v,y.v)==0;}
pt inter(line x,line y){
pt u=x.P-y.P;
db t=det(u,y.v)/det(y.v,x.v);
return x.P+x.v*t;
}
struct pai{int k,b,id;}a[M];
bool operator ==(pai x,pai y){return x.k==y.k&&x.b==y.b;}
bool operator !=(pai x,pai y){return !(x==y);}
bool cmp(pai x,pai y){
if(x.k!=y.k)return x.k<y.k;
return x.b<y.b;
}
int n,m;
vector<int>g[M];
int ps[M];
int ans=0;
int out[M];
void hpi(){
top=0;
for(int i=1;i<=m;i++){
while(top>1&&ptright(inter(s[top-1],s[top]),l[i])) top--;
s[++top]=l[i];ps[top]=i;
}
}
int main(){
int i,j;
n=rd();
for(i=1;i<=n;i++) a[i].b=rd();
for(i=1;i<=n;i++) a[i].k=rd();
for(i=1;i<=n;i++) a[i].id=i;
sort(a+1,a+n+1,cmp);
l[m=1]=line(pt(0,0),pt(0,-1),0);
for(i=1;i<=n;i++){
if(i==1||a[i]!=a[i-1]) l[++m]=line(pt(0,a[i].b),pt(1,a[i].k),0);
l[m].cnt++;
g[m].push_back(a[i].id);
}
hpi();
int tot=0;
for(i=1;i<=top;i++){
ans+=s[i].cnt;
for(j=0;j<g[ps[i]].size();j++) out[++tot]=g[ps[i]][j];
}
sort(out+1,out+tot+1);
printf("%d\n",ans);
for(i=1;i<tot;i++) printf("%d ",out[i]);
printf("%d\n",out[tot]);
return 0;
}
bzoj 3190 [JLOI2013]赛车 半平面交+细节处理的更多相关文章
- 【BZOJ 3190】 3190: [JLOI2013]赛车 (半平面交)
3190: [JLOI2013]赛车 Description 这里有一辆赛车比赛正在进行,赛场上一共有N辆车,分别称为个g1,g2--gn.赛道是一条无限长的直线.最初,gi位于距离起跑线前进ki的位 ...
- bzoj 2618: [Cqoi2006]凸多边形 [半平面交]
2618: [Cqoi2006]凸多边形 半平面交 注意一开始多边形边界不要太大... #include <iostream> #include <cstdio> #inclu ...
- bzoj 1038 瞭望塔 半平面交+分段函数
题目大意 给你一座山,山的形状在二维平面上为折线 给出\((x_1,y_1),(x_2,y_2)...(x_n,y_n)\)表示山的边界点或转折点 现在要在\([x_1,x_n]\)(闭区间)中选择一 ...
- [HNOI2012][BZOJ2732] 射箭 [二分+半平面交]
题面 BZOJ题面 思路 半平面交代码讲解戳这里,用的就是这道题 我们射箭的函数形如$y=Ax^2+Bx$ 考虑每一个靶子$(x_0,y_1,y_2)$,实际上是关于$A,B$的不等式限制条件 我们只 ...
- 2018.07.04 BZOJ 2618 Cqoi2006凸多边形(半平面交)
2618: [Cqoi2006]凸多边形 Time Limit: 5 Sec Memory Limit: 128 MB Description 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n ...
- BZOJ 3190 赛车 | 计算几何
BZOJ 3190 赛车 题面 这里有一辆赛车比赛正在进行,赛场上一共有N辆车,分别称为个g1,g2--gn.赛道是一条无限长的直线.最初,gi位于距离起跑线前进ki的位置.比赛开始后,车辆gi将会以 ...
- 【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] ...
随机推荐
- 解决TS报错Property 'style' does not exist on type 'Element'
在使用queryselector获取一个dom元素,编译时却报错说property 'style' does not exist on type 'element'. 原因:这是typescript的 ...
- python - 日期处理模块
首先就是模块的调用,很多IDE都已经安装好了很多Python经常使用到的模块,所以我们暂时不需要安装模块了. ? 1 2 3 import datetime import time import ca ...
- ERROR 1045 (28000): Access denied for user 'xxx'@'localhost' (using password: YES) MYSQL 新建用户 无法登录 问题解决方法
使用mysql ,出现新建账户无法登录问题 查看 user列表中,有部分账户没有设置密码,将全部重新设置一遍密码,然后还是无法登录. 使用命令 update user set password=pas ...
- LVS-nat模式-原理介绍
集群,为解决某个特定问题将多台计算机组合起来形成的单个系统 lvs-nat: 本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发 lvs集群类 ...
- python入门:print打印输出的用法
#!/usr/bin/python # -*- coding:utf-8 -*- # print打印输出的用法 print("holle,world!") print(1) pri ...
- DC 课程内容
- crond定时操作 crontab
* * * * * 分别表示 分钟 小时 日 月 星期(0-6) 30 17,28,19 * * * 或 30 17-19 * * * 在每天的17-19小时半点时刻执行 30 8-18 ...
- python3 完全平方数(循环)
题目 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? 代码: for i in range(1,85): if 168 % i == 0: j = 168 ...
- Python 成长之路
Python roadmap python 基础 ... 内置常用函数.三元运算.递归 迭代器和生成器 模块和常用的模块 面向对象 对向对象进阶 网络编程 并发编程 ... 数据库 MySQL pym ...
- day24 02 单继承(派生)
day24 02 单继承(派生) 1.首先来看一个简单的例子 比如: 狗类的属性有:吃,喝,看门 鸟类的属性有:吃,喝,下蛋 看门和下蛋就是这两种动物不同的属性,而吃喝是两个共同的属性 以下代码实现了 ...