40pts ,求调
#include "bits/stdc++.h"
using namespace std;
struct node{
int d, v, a;
bool operator< (const node &x) const{return d < x.d;};
} car[100005], up1[100005], up2[100005];
int t, n, m, L, v;
int ans1, ans2;
int p[100005];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> t;
while (t--){
ans1 = 0, ans2 = 0;
cin >> n >> m >> L >> v;
for (int i = 1; i <= n; i++)
cin >> car[i].d >> car[i].v >> car[i].a;
for (int i = 1; i <= m; i++) cin >> p[i];
for (int i = 1; i <= n; i++){
if (car[i].d > p[m]) continue;
if (car[i].a >= 0){
double vv = sqrt(car[i].v * car[i].v + 2 * car[i].a * (p[m] - car[i].d));
if (vv > 1.0 * v) up1[ans1++] = {car[i].d, car[i].v, car[i].a};
}
else {
int l = 1, r = m;
while (l < r){
int mid = (l + r) >> 1;
if (p[mid] < car[i].d) l = mid + 1;
else r = mid;
}
double vv = sqrt(car[i].v * car[i].v + 2 * car[i].a * (p[l] - car[i].d));
if (vv > 1.0 * v) up2[ans2++] = {car[i].d, car[i].v, car[i].a};
}
}
sort(up2, up2 + ans2 + 1);
int mn = m + 1, res = 0, cnt = 0;
up2[ans2 + 1].d = L + 1;
for (int i = 1; i <= ans2; i++){
double dist = (v * v - car[i].v * car[i].v) * 1.0 / (2 * up2[i].a) + up2[i].d;
int l = 1, r = m + 1;
while (l < r){
int mid = (l + r) >> 2;
if (p[mid] < dist) l = mid + 1;
else r = mid;
}
mn = min(mn, l - 1);
if (p[mn] < up2[i + 1].d)
res = mn, mn = m + 1, cnt++;
}
for (int i = 1; i <= ans1; i++){
if (up1[i].d > p[res]) {cnt++; break;}
double vv = sqrt(up1[i].v * up1[i].v + 2 * up1[i].a * (p[res] - up1[i].d));
if (vv <= v) {cnt++; break;}
}
cout << ans1 + ans2 << " " << m - cnt << "\n";
}
return 0;
}