rt,民间70pts,代码如下:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 5;
int t;
int n, m, len, mv;
int d[N], v[N], a[N];
struct Car {
int s, t;
} car[N];
int p[N];
bool cmp(Car a, Car b) {
return a.t < b.t;
}
signed main() {
scanf("%lld", &t);
while (t--) {
int cnt = 0;
int ans = 0;
scanf("%lld %lld %lld %lld", &n, &m, &len, &mv);
for (int i = 1; i <= n; ++i) {
scanf("%lld %lld %lld", &d[i], &v[i], &a[i]);
}
for (int i = 1; i <= m; ++i) {
scanf("%lld", &p[i]);
}
for (int i = 1; i <= n; ++i) {
int ll = 1, rr = m, sta = 0;
while (ll <= rr) {
int mid = (ll + rr) >> 1;
if (p[mid] >= d[i]) {
rr = mid - 1;
sta = mid;
} else {
ll = mid + 1;
}
}
if (sta == 0) {
continue;
}
if (a[i] == 0) {
if (v[i] > mv) {
++ans;
car[++cnt].s = sta;
car[cnt].t = m;
// cout << car[cnt].s << ' ' << car[cnt].t << endl;
}
} else if (a[i] > 0) {
int l = sta, r = m, res = 0;
// cout << i << endl;
while (l <= r) {
int mid = (l + r) >> 1;
int nv = v[i] * v[i] + 2 * a[i] * (p[mid] - d[i]);
if (nv > mv * mv) {
r = mid - 1;
res = mid;
} else {
l = mid + 1;
}
}
if (res != 0) {
++ans;
car[++cnt].s = res;
car[cnt].t = m;
// cout << car[cnt].s << ' ' << car[cnt].t << endl;
}
} else {
int nv = v[i] * v[i] + 2 * a[i] * (p[sta] - d[i]);
if (nv > mv * mv) {
++ans;
car[++cnt].s = sta;
int l = sta, r = m, res = 0;
while (l <= r) {
int mid = (l + r) >> 1;
int nv = v[i] * v[i] + 2 * a[i] * (p[mid] - d[i]);
if (nv <= mv * mv) {
r = mid - 1;
res = mid;
} else {
l = mid + 1;
}
}
if (res != 0) {
car[cnt].t = res - 1;
} else {
car[cnt].t = m;
}
// cout << car[cnt].s << ' ' << car[cnt].t << endl;
}
}
}
printf("%lld ", ans);
sort(car + 1, car + cnt + 1, cmp);
ans = 1;
int nt = car[1].t;
for (int i = 2; i <= cnt; ++i) {
if (nt < car[i].s) {
++ans;
nt = car[i].t;
}
}
printf("%lld\n", m - ans);
}
return 0;
}