BZOJ-3190 [JLOI2013]赛车

转成二元一次不等式组,然后半平面交。

#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cctype>
#include <algorithm>
#define rep(i, l, r) for(int i=l; i<=r; i++)
#define clr(x, c) memset(x, c, sizeof(x))
#define maxn 12345
using namespace std;
typedef long long ll;
inline int read()
{
	int x=0, f=1; char ch=getchar();
	while (!isdigit(ch)) {if (ch==‘-‘) f=-1; ch=getchar();}
	while (isdigit(ch)) x=x*10+ch-‘0‘, ch=getchar();
	return x*f;
}
struct line{ll b, k; int n;} l[maxn];
bool cmp(line a, line b){return a.k>b.k || (a.k==b.k && a.b>b.b);}

int n, v[maxn], tot;
inline ll Get(line x, line y, line z){return (y.b-x.b)*(y.k-z.k)-(z.b-y.b)*(x.k-y.k);}
int main()
{
	n=read();
	rep(i, 1, n) l[i].b=read();
	rep(i, 1, n) l[i].k=read();
	rep(i, 1, n) l[i].n=i;
	sort(l+1, l+1+n, cmp);
	v[++tot]=1; rep(i, 2, n)
	{
		if (l[i].k==l[i-1].k && l[i].b==l[i-1].b) {v[++tot]=i; continue;}
		if (l[i].k==l[i-1].k) continue;
		while (tot>1)
			if (Get(l[i], l[v[tot]], l[v[tot-1]])<=0) break; else tot--;
		v[++tot]=i;
	}
	while (tot>1)
		if (l[v[tot-1]].b-l[v[tot]].b<=0) break; else tot--;
	rep(i, 1, tot) v[i]=l[v[i]].n;
	sort(v+1, v+tot+1);
	printf("%d\n", tot); rep(i, 1, tot) printf("%d%c", v[i], i==tot?‘\n‘:‘ ‘);
	return 0;
}
时间: 2024-10-12 10:23:52

BZOJ-3190 [JLOI2013]赛车的相关文章

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

3190: [JLOI2013]赛车 Description 这里有一辆赛车比赛正在进行,赛场上一共有N辆车,分别称为个g1,g2--gn.赛道是一条无限长的直线.最初,gi位于距离起跑线前进ki的位置.比赛开始后,车辆gi将会以vi单位每秒的恒定速度行驶.在这个比赛过程中,如果一辆赛车曾经处于领跑位置的话(即没有其他的赛车跑在他的前面),这辆赛车最后就可以得奖,而且比赛过程中不用担心相撞的问题.现在给出所有赛车的起始位置和速度,你的任务就是算出那些赛车将会得奖. Input 第一行有一个正整数

【BZOJ 3190】 [JLOI2013]赛车

3190: [JLOI2013]赛车 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 803 Solved: 279 [Submit][Status][Discuss] Description 这里有一辆赛车比赛正在进行,赛场上一共有N辆车,分别称为个g1,g2--gn.赛道是一条无限长的直线.最初,gi位于距离起跑线前进ki的位置.比赛开始后,车辆gi将会以vi单位每秒的恒定速度行驶.在这个比赛过程中,如果一辆赛车曾经处于领跑位置的话(即没有其他

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

[BZOJ3190][JLOI2013]赛车 Description 这里有一辆赛车比赛正在进行,赛场上一共有N辆车,分别称为个g1,g2……gn.赛道是一条无限长的直线.最初,gi位于距离起跑线前进ki的位置.比赛开始后,车辆gi将会以vi单位每秒的恒定速度行驶.在这个比赛过程中,如果一辆赛车曾经处于领跑位置的话(即没有其他的赛车跑在他的前面),这辆赛车最后就可以得奖,而且比赛过程中不用担心相撞的问题.现在给出所有赛车的起始位置和速度,你的任务就是算出那些赛车将会得奖. Input 第一行有一

BZOJ 3190 JLOI 2013 赛车 暴力

题目大意:给出一些赛车的速度和初始位置,问那些赛车在比在中有过领先于其他所有车的时候. 思路:正解是解不等式组然后半平面交,不太想写.据说当年这个题暴力只卡掉了1个点,但是如果半平面交没写明白分就很低了.. 暴力也没什么好说的,就是注意一下输出,最后不能有换行,否则PE.. CODE: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M

bzoj 3192: [JLOI2013]删除物品

3192: [JLOI2013]删除物品 Description 箱子再分配问题需要解决如下问题: (1)一共有N个物品,堆成M堆. (2)所有物品都是一样的,但是它们有不同的优先级. (3)你只能够移动某堆中位于顶端的物品. (4)你可以把任意一堆中位于顶端的物品移动到其它某堆的顶端.若此物品是当前所有物品中优先级最高的,可以直接将之删除而不用移动. (5)求出将所有物品删除所需的最小步数.删除操作不计入步数之中. (6)只是一个比较难解决的问题,这里你只需要解决一个比较简单的版本: 不会有两

BZOJ3190[JLOI2013]赛车

Description 这里有一辆赛车比赛正在进行,赛场上一共有N辆车,分别称为个g1,g2--gn.赛道是一条无限长的直线.最初,gi位于距离起跑线前进ki的位置.比赛开始后,车辆gi将会以vi单位每秒的恒定速度行驶.在这个比赛过程中,如果一辆赛车曾经处于领跑位置的话(即没有其他的赛车跑在他的前面),这辆赛车最后就可以得奖,而且比赛过程中不用担心相撞的问题.现在给出所有赛车的起始位置和速度,你的任务就是算出那些赛车将会得奖. Input 第一行有一个正整数N表示赛车的个数. 接下来一行给出N个

BZOJ 3193 JLOI2013 地形生成 组合数学

题目大意:给定一些山,每座山有一个高度和一个关键值,现在要将这些山排成一个序列,要求每座山之前高度高于它的山的数量不能超过它的关键值,求合法的标号序列数和高度序列数 = = 首先我们考虑第一问 我们发现高度较小的山对高度较大的山是没有影响的 那么我们可以将山按照高度从大到小排序 每座山插入时都有一些备选位置 将备选位置数相乘即是答案 现在考虑第二问 嘲讽:谁能告诉我O(n^3)到底怎么做= = 我们按照之前的思路将山按照高度从大到小排序 将高度相同的山拎出来 每一座山都有一些位置可选 那么我们不

bzoj 3191: [JLOI2013]卡牌游戏

Description N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡片上的数字为X,则庄家首先把卡片上的数字向所有玩家展示,然后按顺时针从庄家位置数第X个人将被处决即退出游戏.然后卡片将会被放回卡牌堆里并重新洗牌.被处决的人按顺时针的下一个人将会作为下一轮的庄家.那么经过N-1轮后最后只会剩下一个人,即为本次游戏的胜者.现在你预先知道了总共有M张卡片,也知道每张卡片上的数字.现在

bzoj 3191 [JLOI2013]卡牌游戏 概率dp

题面 题目传送门 解法 设\(f_{i,j}\)表示总共\(i\)个人,第\(j\)个人最终获胜的概率 枚举当前选择的是哪一张卡,那么就知道下一轮被淘汰的是谁了,假设是\(x\) 显然,下一轮的庄家就是\(x\)的下一个人 如果\(x=j\),那么可以不用管这种情况 如果\(x>j\),那么\(j\)在下一轮的编号为\(i-x+j\),否则为\(j-x\) 对应的两种情况转移一下即可 时间复杂度:\(O(n^2m)\) 代码 #include <bits/stdc++.h> #defin