题解:P6995 [NEERC2014] Knockout Racing
题目翻译
背景
在潘多拉星球,赛车比以往任何时候都更受欢迎。但这些比赛相当不寻常。有
第
英俊的迈克想要用炸药淘汰一些汽车。因此,他有
你的任务是回答迈克的问题。
输入格式
输入文件的第一行包含两个整数
接下来的
接下来的
输出格式
写入输出文件
解题
思路:
其实整个题目的核心就是三行代码解决
if ((t / (b[j] - a[j])) % 2 == 1) {l = b[j] - t % (b[j] - a[j]);
else l = a[j] + t % (b[j] - a[j]);
if (l >= x && l <= y)ans++;
- 计算在给定时间
t后,位于坐标范围[x, y]内的车辆数量,并将结果存储在ans中。 - 首先,声明了一个名为
l的long long类型变量,用于存储每辆车在给定时间t后的位置。 - 然后,通过
if-else条件语句,根据每辆车在奇数或偶数往返周期内的不同,计算每辆车在给定时间t后的位置l。如果车辆在奇数往返周期内,则l被赋值为b[j] - t % (b[j] - a[j]),否则l被赋值为a[j] + t % (b[j] - a[j])。 - 接着,通过条件判断
if (l >= x && l <= y),检查每辆车在给定时间t后的位置l是否在指定的坐标范围[x, y]内。若在范围内,则将ans加一,表示有一辆车在该时间范围内位于指定的坐标范围内。
式子解释(不知道叫啥了就叫式子吧):
b[j] - t % (b[j] - a[j])
它计算了在给定时间 t 后,位于奇数往返周期内的车辆的位置。具体来说,b[j] - a[j] 表示车辆从起始坐标 a[j] 到结束坐标 b[j] 的距离,而 t % (b[j] - a[j]) 则表示当前往返周期内已经行驶的时间。因为车辆是以每秒 1 米的速度行驶的,所以 (b[j] - t % (b[j] - a[j])) 表示从结束坐标 b[j] 开始倒退,倒退的距离为当前往返周期内已行驶的时间,从而得到了车辆在奇数往返周期内的位置。
a[j] + t % (b[j] - a[j])
它计算了在给定时间 t 后,位于偶数往返周期内的车辆的位置。同样,a[j] 表示车辆的起始坐标,而 t % (b[j] - a[j]) 则表示当前往返周期内已经行驶的时间。因为车辆是以每秒 1 米的速度行驶的,所以 (a[j] + t % (b[j] - a[j])) 表示从起始坐标 a[j] 开始继续向前行驶,行驶的距离为当前往返周期内已行驶的时间,从而得到了车辆在偶数往返周期内的位置。
判断原因解释:
if (l >= x && l <= y)
它用于判断每辆车在给定时间 t 后的位置 l 是否在指定的坐标范围 [x, y] 内。如果车辆的位置 l 大于等于 x 并且小于等于 y,则说明该车辆在指定的坐标范围内,条件成立。
代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n, m, a[100010], b[1000010], x, y, t,ans,l;
signed main() {
cin >> n >> m;
for (int i = 1; i <= n; i++)cin >> a[i] >> b[i];
// 对于每个问题,计算解决方案
for (int i = 1; i <= m; i++) {
cin >> x >> y >> t;
ans = 0;
for (int j = 1; j <= n; j++) {
if ((t / (b[j] - a[j])) % 2 == 1) {
// 如果车辆在奇数往返周期内
l = b[j] - t % (b[j] - a[j]);
} else {
// 如果车辆在偶数往返周期内
l = a[j] + t % (b[j] - a[j]);
}
if (l >= x && l <= y)ans++;
}
cout << ans << endl;
}
}