现在的数据是官方数据吗,我考场上写的 double 写法,正式数据 100 分,但有没有可能被卡掉呢?
#include <bits/stdc++.h>
#define long long long
using namespace std;
// 记得清空数组
// 记得处理好 a < 0,同时使出点在 L 前的 cases
const int N = (int) 1E5;
const int M = (int) 1E5;
const double EPS = 1E-6;
struct node {
int u, v;
friend bool operator < (node a, node b) {
return a.v < b.v;
}
};
int n, m, L;
int d[N];
int p[M];
vector<node> A;
double V;
double v[N], a[N];
void count() {
A = vector<node>();
int c = 0;
for (int i = 0; i < n; i++) {
int x = distance(p, lower_bound(p, p + m, d[i]));
if (x == m) {
// 后面没有其他的测速站点了
continue;
}
// 如果不会超速,就 continue
if (abs(a[i]) <= EPS) {
if (v[i] <= V) {
continue;
}
} else if (a[i] > 0) {
int s = p[m - 1] - d[i];
double e = sqrt(v[i] * v[i] + 2 * a[i] * s);
if (e <= V) {
continue;
}
} else if (a[i] < 0) {
double t = (0 - v[i]) * v[i] / (2 * a[i]);
if (d[i] + t < p[x]) {
continue;
}
int s = p[x] - d[i];
double e = sqrt(v[i] * v[i] + 2 * a[i] * s);
if (e <= V) {
continue;
}
} else {
assert(false);
}
c = c + 1;
if (abs(a[i]) <= EPS) {
A.push_back((node) {x, m - 1});
} else if (a[i] > 0) {
int low = x, high = m - 1;
while (low <= high) {
int center = (low + high) / 2;
int s = p[center] - d[i];
double e = sqrt(v[i] * v[i] + 2 * a[i] * s);
if (e > V) {
high = center - 1;
} else {
low = center + 1;
}
}
A.push_back((node) {low, m - 1});
} else if (a[i] < 0) {
double t = (0 - v[i]) * v[i] / (2 * a[i]);
// 找最后一个可以检查到的摄像头
int low = x, high = m - 1;
while (low <= high) {
int center = (low + high) / 2;
int position = p[center];
// 如果根本到不了
if (d[i] + t < position) {
high = center - 1;
}
int s = p[center] - d[i];
double e = sqrt(v[i] * v[i] + 2 * a[i] * s);
if (e > V) {
low = center + 1;
} else {
high = center - 1;
}
}
A.push_back((node) {x, high});
} else {
assert(false);
}
}
cout << c << " ";
// cout << "\n";
// for (int i = 0; i < (int) A.size(); i++) {
// cout << A[i].u + 1 << " " << A[i].v + 1 << "\n";
// }
sort(A.begin(), A.end());
int prev = 0 - 1;
int count = 0;
for (int i = 0; i < (int) A.size(); i++) {
int u = A[i].u, v = A[i].v;
if (prev < u) {
count = count + 1;
prev = v;
}
}
cout << m - count << "\n";
}
void solve() {
cin >> n >> m >> L >> V;
for (int i = 0; i < n; i++) {
cin >> d[i] >> v[i] >> a[i];
}
for (int i = 0; i < m; i++) {
cin >> p[i];
}
count();
}
int main() {
freopen("detect.in", "r", stdin);
freopen("detect.out", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(nullptr);
int t;
cin >> t;
for (int i = 0; i < t; i++) {
solve();
}
return 0;
}