赛时好像调过但是我忘了是什么错误了。
# include <bits/stdc++.h>
# define int long long
# define inf 1e15
using namespace std;
const int N = 1e5 + 10;
int n , m, l ,V ,cnt ,d[N] ,v[N] ,a[N] ,p[N];
bool f[N];
struct node {int l ,r;}segment[N];
inline void solve0 (int i){
if (d[i] > p[m] || v[i] <= V) return;
int l = 1 ,r = m ,res = -114;
while (l <= r){
int mid = ((l + r) >> 1ll);
if (p[mid] > d[i] - 1) r = mid - 1 ,res = mid;//找到第一个>= d[i] (> d[i] - 1) 的数的位置。
else l = mid + 1;
}
segment[++ cnt].l = res ,segment[cnt].r = m;
} inline void solve1 (int i){
if (d[i] > p[m]) return ;
int l = 1 ,r = m , t = V * V - v[i] * v[i] ,res = -114;
// (V * V - v[i] * v[i]) / 2 / a[i] + d[i] < (找到一个合法的 k 且最小) p[k]
// t + d[i] * 2 * a[i] < p[k] * 2 * a[i]
while (l <= r){
int mid = ((l + r) >> 1ll);
if (t + d[i] * 2ll * a[i] < p[mid] * 2ll * a[i]) r = mid - 1 ,res = mid;
else l = mid + 1;
}
if (res <= m && res != -114) segment[++ cnt].l = res ,segment[cnt].r = m;
} inline void solve2 (int i){
if (d[i] > p[m] || v[i] <= V) return;
int l = 1 ,r = m ,t = V * V - v[i] * v[i] ,res = -114 ,pos = -114;
//t = -t ,a[i] = -a[i];
while (l <= r){
int mid = ((l + r) >> 1ll);
if (p[mid] > d[i] - 1) r = mid - 1 ,pos = mid;
else l = mid + 1;
}
l = pos ,r = m;
// cout << a[i] << ' ';
// for (int j = 1; j <= m ;j ++)cout << p[j] * 2 * a[i] << ' ';
// cout << " const: " << t + d[i] * 2ll * a[i] << endl;
while (l <= r){
int mid = ((l + r) >> 1ll);
double vi = v[i] * v[i] * 1.0 + 2.0 * a[i] * (p[mid] - d[i]);
if (vi > V * V) l = mid + 1 ,res = mid;
else r = mid - 1 ;
}
// cout << "pos and res is : " << pos << ' ' << res << endl;
if (res <= m && res != -114) segment[++ cnt].l = pos ,segment[cnt].r = res;
} inline void solve3 (){
sort (segment + 1, segment + 1 + cnt ,[](node &x ,node &y){return (x.l == y.l ? x.r > y.r : x.l < y.l);});
int NR = inf;
for (int i = 1 ;i <= cnt ;i ++) f[i] = 0;
// for (int i = 1 ;i <= cnt; i ++)
// cout << segment[i].l << ' ' << segment[i].r << endl;
for (int i = cnt ;i >= 1; i --){
if (NR <= segment[i].r) f[i] = 1;
NR = min (NR ,segment[i].r);
} int ans = 0 ,NL = 0;
for (int i = 1;i <= cnt ;i ++){
if (f[i]){
f[i] = 0;
continue;
} if (NL < segment[i].l){
NL = segment[i].r;
++ ans;
}
} cout << m - ans << endl;
} inline void solve (){
cin >> n >> m >> l >> V;
cnt = 0;
for (int i = 1; i <= n; i ++) cin >> d[i] >> v[i] >> a[i];
for (int i = 1; i <= m; i ++) cin >> p[i];
for (int i = 1 ;i <= n ; i ++){
if (!a[i]) solve0 (i);
else if (a[i] > 0) solve1 (i);
else solve2 (i);
} cout << cnt << ' ';
solve3 ();
} signed main (){
int T;
cin >> T;
while (T --) solve ();
return 0;
}