Welcome to Liukejie'|

liukejie

园龄:1年8个月粉丝:5关注:11

P9784 [ROIR 2020 Day1] 超速 题解

题目意思

n 条道路,每段公路的长度 li,限速是 vi,超速就要按照规定罚款,不同的超速程度有不同金额的罚款,每一辆车从 si 的时刻开始行驶,ti 的时刻离开该条公路,求最小的最大罚款金额。

思路

题目中说最小的最大罚款金额,我们可以考虑二分枚举限速范围,时间复杂度 O(qnlogm)

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i, l, r) for(int i = l; i <= r; ++ i)
#define per(i, r, l) for(int i = r; i >= l; -- i)
const int N = 1e5 + 10;
int l[N], v[N], a[N], f[N], n, m, Q, s, t;
double d[N];
main()
{
	scanf("%lld", &n);
	rep(i, 1, n) scanf("%lld", &v[i]);
	rep(i, 1, n) scanf("%lld", &l[i]);
	scanf("%lld", &m);
	rep(i, 1, m - 1) scanf("%lld", &a[i]);
	rep(i, 1, m) scanf("%lld", &f[i]);
	rep(i, 0, m - 1) rep(j, 1, n) d[i] += 1.0 * l[j] / (v[j] + a[i]);
	scanf("%lld", &Q);
	for(; Q; -- Q)
	{
		scanf("%lld %lld", &s, &t);
		int l = 0, r = m + 1;
		for(; l <= r;)
		{
			int mid = (l + r) >> 1;
			if(d[mid] <= t - s) r = mid - 1;
			else l = mid + 1;
		}
		printf("%lld\n", f[l]);
	}
	return 0;
}
posted @   liukejie  阅读(9)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起