注:本苟蒻参考了大佬chenxi2009的题解
40pts求大佬帮debug……qwq
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+5;
struct Node{
int l,r;
}s[N];
int T,n,m,L,V,d[N],v[N],a[N],p[N];
bool cmp(Node x,Node y){
return (x.r!=y.r?x.r<y.r:x.l<y.l);
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>T;
for(int ans,last;T--;){
ans=last=0;
memset(s,0,sizeof(s));
cin>>n>>m>>L>>V;
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++){
const int x=V*V-v[i]*v[i],y=2*a[i];
int lk,rk,ld,rd;
if(a[i]>0){
rd=L,rk=0;
if(v[i]>=V){
ld=d[i];
lk=(v[i]==V);
}
else if(d[i]+(x+y-1)/y<=L){
ld=d[i]+(x+y-1/y);
lk=(ld==d[i]+x/y);
}
else
continue;
}
else if(a[i]<0){
if(v[i]>V){
ld=d[i];
lk=0;
if(d[i]+x/y>=L){
rd=L;
rk=0;
}
else{
rd=d[i]+x/y;
rk=!(x%y);//-x%y?
}
}
else
continue;
}
else{
if(v[i]>V){
lk=rk=0;
ld=d[i];
rd=L;
}
else
continue;
}
int l=1,r=m;
for(;l<r;){
int mid=l+r>>1;
if(p[mid]>ld||p[mid]==ld&&!lk)
r=mid;
else
l=mid+1;
}
if(p[l]<ld||p[l]>rd||p[l]==ld&&lk||p[l]==rd&&rk)
continue;
s[++ans].l=l;
l=1,r=m;
for(;l<r;){
int mid=l+r+1>>1;
if(p[mid]<rd||p[mid]==rd&&!rk)
l=mid;
else
r=mid-1;
}
s[ans].r=l;
}
sort(s+1,s+1+ans,cmp);
for(int i=1;i<=ans;i++)
if(s[i].l>last){
last=s[i].r;
m--;
}
cout<<ans<<' '<<m<<'\n';
}
return 0;
}