大样例全过。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,m,L,V,top;
int d[N],v[N],a[N],p[N];
pair<int,int>stk[N];
inline bool cmp(pair<int,int>A,pair<int,int>B){
return A.second!=B.second?A.second<B.second:A.first<B.first;
}
inline void add(int lef,int rig){
if(lef>rig||lef>p[m]||rig<p[1])return;
int l=1,r=m,mid;
while(l<r){
mid=l+r>>1;
if(lef<=p[mid])r=mid;
else l=mid+1;
}
if(rig<p[l])return;
lef=l;r=m;
while(l<r){
mid=l+r+1>>1;
if(p[mid]<=rig)l=mid;
else r=mid-1;
}
stk[++top]={lef,l};
return;
}
inline void solve(){
scanf("%d%d%d%d",&n,&m,&L,&V);
top=0;
for(int i=1;i<=n;i++)scanf("%d%d%d",&d[i],&v[i],&a[i]);
for(int i=1;i<=m;i++)scanf("%d",&p[i]);
for(int i=1,x;i<=n;i++){
if(a[i]>0){
if(v[i]>V)add(d[i],L);
else if(v[i]*v[i]+2*a[i]*(L-d[i])>V*V){
x=(V*V-v[i]*v[i])/(a[i]+a[i]);
if((V*V-v[i]*v[i])%(a[i]+a[i])==0)x++;
add(x+d[i],L);
}
}
else if(a[i]==0){
if(v[i]>V)add(d[i],L);
}
else if(v[i]>V){
x=(V*V-v[i]*v[i])/(a[i]+a[i]);
if((V*V-v[i]*v[i])%(a[i]+a[i])==0)x--;
add(d[i],d[i]+x);
}
}
sort(stk+1,stk+top+1,cmp);
for(int i=1,mx=0;i<=top;i++)
if(mx<stk[i].first){
m--;
mx=stk[i].second;
}
printf("%d %d\n",top,m);
return;
}
int main(){
int t;scanf("%d",&t);
while(t--)solve();
return 0;
}