这是我考场上的代码,实在不知道该怎么改
// 2024 CSP-S 40pts
#include <bits/stdc++.h>
#define maxn 100003
#define fin cin
#define fout cout
using namespace std;
int T, n/*车辆数*/, m/*测速仪数*/, L/*公路长度*/, V/*限速*/, p[1000003], cnt_cars/*超速车辆*/;
//int cnta_0, cnta_up, cnta_down;
int main() {
//ifstream fin("light.in");
//ofstream fout("light.out");
ios::sync_with_stdio(0); fin.tie(0); fout.tie(0);
fin >> T;
while (T--) {
//init
struct Data {
int d/*开始位置*/, v/*初始速度*/, a/*加速度*/;
}data[maxn];
cnt_cars = 0/*超速车辆*/;// cnta_0 = 0, cnta_up = 0, cnta_down = 0;
fin >> n >> m >> L >> V;
for (int i = 0; i < n; i++) {
fin >> data[i].d >> data[i].v >> data[i].a;
/*
if (data[i].a == 0) {
cnta_0++;
}
if (data[i].a > 0) {
cnta_up++;
}
if (data[i].a < 0) {
cnta_down++;
}*/
}
for (int i = 1; i <= m; i++) {
fin >> p[i];
}
//======//
/*
if (cnta_0 == n) {
for (int i = 0; i < n; i++) {
if (data[i].d > p[m]) {
continue;
}
if (data[i].v > V) {
cnt_cars++;
}
}
fout << cnt_cars << " " << m - 1 << endl;
continue;
}
else if (cnta_up == n) {
for (int i = 0; i < n; i++) {
if (data[i].d > p[m]) {
continue;
}
int s = p[m] - data[i].d;
if (data[i].v > V) {
cnt_cars++;
}
else if ((double)(sqrt(pow(data[i].v, 2) + 2 * data[i].a * s)) > (double)V) {
cnt_cars++;
}
}
fout << cnt_cars << " " << m - 1 << endl;
continue;
}
else if (cnta_down == n) {
int cnt_p = 0;
set<int> vis;
for (int i = 0; i < n; i++) {
if (data[i].d > p[m] || data[i].v <= V) {
continue;
}
int index = upper_bound(p, p + m, data[i].d) - p;// TLE 风险
if (p[index - 1] == data[i].d) {// 在测速仪上
index--;
}
int s = p[index] - data[i].d;
if ((double)(sqrt(pow(data[i].v, 2) + 2 * data[i].a * s)) > (double)V) {
cnt_cars++;
if (vis.count(index) == 0) {
cnt_p++;
}
vis.insert(index);
}
}
fout << cnt_cars << " " << m - cnt_p << endl;
continue;
}
*/
if (0) {
}
else {
int cnt_p = 0;
set<int> vis;
for (int i = 0; i < n; i++) {
if (data[i].a == 0) {
if (data[i].d > p[m]) {
continue;
}
if (data[i].v > V) {
cnt_cars++;
if (vis.count(m) == 0) {
cnt_p++;
}
vis.insert(m);
}
}
if (data[i].a > 0) {
if (data[i].d > p[m]) {
continue;
}
int s = p[m] - data[i].d;
if (data[i].v > V) {
cnt_cars++;
if (vis.count(m) == 0) {
cnt_p++;
}
vis.insert(m);
}
else if ((double)(sqrt(pow(data[i].v, 2) + 2 * data[i].a * s)) > (double)V) {
cnt_cars++;
if (vis.count(m) == 0) {
cnt_p++;
}
vis.insert(m);
}
}
if (data[i].a < 0) {// 有 BUG
if (data[i].d > p[m] || data[i].v <= V) {
continue;
}
int index = upper_bound(p, p + m, data[i].d) - p;// TLE 风险
if (p[index - 1] == data[i].d) {// 生成在测速仪上
index--;
}
int s = p[index] - data[i].d;
if ((double)(sqrt(pow(data[i].v, 2) + 2 * data[i].a * s)) > (double)V) {
cnt_cars++;
if (vis.count(index) == 0) {
cnt_p++;
}
vis.insert(index);
}
}
}
fout << cnt_cars << " " << m - cnt_p << endl;
}
}
return 0;
}