rt
记录
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+100;
int D,vm,A;
int p[N];
int n,m,L,V,T;
struct Node
{
int l,r;
bool vis;
}ling[N];
bool vis[N];
int check(int num)
{
int l=0,r=m;
while(l<r)
{
int mid=(l+r)/2;
if(p[mid]>=num)
r=mid;
else
l=mid+1;
}
return p[l];
}
int check2(int num)
{
int l=0,r=m;
while(l<r)
{
int mid=(l+r+1)/2;
if(p[mid]<=num)
l=mid;
else
r=mid-1;
}
return p[l];
}
bool cmp(Node a,Node b)
{
return a.r<b.r;
}
int main()
{
// freopen("detect3.in","r",stdin);
// freopen("detect.out","w",stdout);
cin>>T;
while(T--)
{
int ans=0,sum=0;
for(int i=1;i<=n;i++)
ling[i].vis=0;
cin>>n>>m>>L>>V;
for(int i=1;i<=n;i++)
{
cin>>D>>vm>>A;
if(A>0)
{
ling[i].l=1.0*((V*V-vm*vm)/(1.0*2*A))+D+1;
ling[i].r=L;
ling[i].vis=1;
}
else if(A<0)
{
if(vm>V)
{
ling[i].l=1.0*D;
ling[i].r=min(1.0*L,1.0*((V*V-vm*vm)/(1.0*2*A))+D-0.000001);
ling[i].vis=1;
}
}
else
{
if(vm>V)
{
ling[i].l=1.0*D;
ling[i].r=1.0*L;
ling[i].vis=1;
}
}
if(ling[i].l>ling[i].r)
ling[i].vis=0;
}
for(int i=1;i<=m;i++)
cin>>p[i];
sort(p+1,p+1+m);
for(int i=1;i<=n;i++)
{
if(ling[i].vis==0)
continue;
int k=check(ling[i].l);
if(k>=ling[i].l&&k<=ling[i].r)
ans++;
else
ling[i].vis=0;
}
sort(ling+1,ling+1+n,cmp);
int tp=0;
for(int i=1;i<=n;i++)
{
if(ling[i].vis==0)
continue;
if(tp>=ling[i].l&&tp<=ling[i].r)
continue;
else
{
tp=check2(ling[i].r);
sum++;
}
}
cout<<ans<<" "<<m-sum<<endl;
}
return 0;
}