#include <stdio.h>
#include <string.h>
#include <math.h>
#include <utility>
#include <algorithm>
#include <vector>
#include <bitset>
int countOfTestcases, countOfCars = 0, countOfSpeedTesters = 0, lengthOfRoad, speedLimit;
typedef struct _car {
int startPosition = 0;
int originalSpeed = 0;
int speedChangingRate = 0;
bool isJudgingOverspeed = false;
std::pair<int, int> overspeedInterval;
std::pair<int, int> speedTestInterval;
} car;
car cars[100008];
int speedTesterPositions[100008];
int main(void) {
#ifdef DEBUG
freopen("detect.in", "r", stdin);
freopen("detect.out", "w", stdout);
#endif
scanf("%d", &countOfTestcases);
while (countOfTestcases--) {
scanf("%d %d %d %d", &countOfCars, &countOfSpeedTesters, &lengthOfRoad, &speedLimit);
for (int i = 0; i < countOfCars; i++) {
scanf("%d %d %d", &cars[i].startPosition, &cars[i].originalSpeed, &cars[i].speedChangingRate);
cars[i].isJudgingOverspeed = false;
cars[i].overspeedInterval.first = -1;
cars[i].overspeedInterval.second = -1;
}
for (int i = 0; i < countOfSpeedTesters; i++) scanf("%d", &speedTesterPositions[i]);
speedTesterPositions[countOfSpeedTesters] = 0x3f3f3f3f;
for (int i = 0; i < countOfCars; i++) {
if (cars[i].speedChangingRate == 0) {
if (cars[i].originalSpeed > speedLimit) {
cars[i].overspeedInterval.first = cars[i].startPosition;
cars[i].overspeedInterval.second = lengthOfRoad;
}
} else if (cars[i].speedChangingRate > 0) {
cars[i].overspeedInterval.first = (int)ceil((long double)((long long)speedLimit * speedLimit - (long long)cars[i].originalSpeed * cars[i].originalSpeed) / (long double)((long double)2.0f * cars[i].speedChangingRate) + cars[i].startPosition + 1e-10);
cars[i].overspeedInterval.second = lengthOfRoad;
} else if (cars[i].speedChangingRate < 0) {
if (cars[i].originalSpeed > speedLimit) {
cars[i].overspeedInterval.second = (int)floor((long double)((long long)speedLimit * speedLimit - (long long)cars[i].originalSpeed * cars[i].originalSpeed) / (long double)((long double)2.0f * cars[i].speedChangingRate) + cars[i].startPosition - 1e-10);
cars[i].overspeedInterval.first = cars[i].startPosition;
}
}
}
int carsCaught = 0;
std::vector<std::pair<int, int>> overSpeedIntervals;
for (int i = 0; i < countOfCars; i++) {
if (cars[i].overspeedInterval.first >= 0 && cars[i].overspeedInterval.first <= lengthOfRoad) {
auto theFirstSpeedTester = std::lower_bound(
speedTesterPositions,
speedTesterPositions + countOfSpeedTesters + 1, cars[i].overspeedInterval.first
);
if (*theFirstSpeedTester <= cars[i].overspeedInterval.second) {
cars[i].isJudgingOverspeed = true;
carsCaught++;
cars[i].speedTestInterval.first = theFirstSpeedTester - speedTesterPositions;
cars[i].speedTestInterval.second = std::upper_bound(
speedTesterPositions,
speedTesterPositions + countOfSpeedTesters, cars[i].overspeedInterval.second
) - 1 - speedTesterPositions;
overSpeedIntervals.push_back(cars[i].speedTestInterval);
}
}
}
std::sort(overSpeedIntervals.begin(), overSpeedIntervals.end(), [](std::pair<int, int> &a, std::pair<int, int> &b) -> bool {
if (a.second == b.second) return a.first < b.first;
return a.second < b.second;
});
int rightBorder = -1, remainTesters = 0;
for (int i = 0; i < overSpeedIntervals.size(); i++) {
if (overSpeedIntervals[i].first <= rightBorder) continue;
remainTesters++;
rightBorder = overSpeedIntervals[i].second;
}
printf("%d %d\n", carsCaught, countOfSpeedTesters - remainTesters);
}
return 0;
}
无法通过 detect4.in

左边为我的代码的输出结果,右边为 detect4.ans
谢谢