写的就是O(n^2)洛谷官方数据告诉我20,CCF逆天到0
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iomanip>
using namespace std;
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-48;ch=getchar();}
return x*f;
}
const int N=1e4;
int cnt1[N],cnt2[N][N],pre[N];
struct node{
double a,d,v;
}a[N];
struct node2{
int p,knt,cnt2[N];
}b[N];
bool cmp(node2 x,node2 y){
return x.knt<y.knt;
}
int main(){
//rp++
//freopen("detect.in","r",stdin);
//freopen("detect.out","w",stdout);
int t=read();
while(t--){
int n=read(),m=read(),l=read(),ans=0;
double v;
cin>>v;
bool fg0=1,fgf=1;
for(int i=1;i<=n;i++){
a[i].d=read(),a[i].v=read(),a[i].a=read();
if(a[i].a!=0)fg0=0;
}
for(int i=1;i<=m;i++)b[i].p=read();
if(fg0&&n>=3001){
//只需要找第m个就可以
int cnt=0;
for(int i=1;i<=n;i++){
if(a[i].d>b[m].p)continue;
if(a[i].v>v)cnt++;
}
cout<<cnt<<' '<<n-1<<'\n';
continue;
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(a[j].d>b[i].p)continue;
long double sd=1.0*sqrt(1.0*a[j].v*a[j].v+2.0*a[j].a*(b[i].p-a[j].d));
if(sd>v){
cnt1[j]++;
b[i].cnt2[j]=1;
b[i].knt++;
// cout<<sd<<' '<<j<<' '<<p[i]<<endl;
}
}
}
for(int i=1;i<=n;i++){
if(cnt1[i]>=1)ans++;
//cout<<cnt1[i]<<' ';
}
sort(b+1,b+1+m,cmp);
cout<<ans<<' ';
int c=0;
for(int i=1;i<=m;i++){
int flag=1;
for(int j=1;j<=n;j++)pre[j]=cnt1[j];
for(int j=1;j<=n;j++){
if(b[i].cnt2[j]==0)continue;
if(b[i].cnt2[j]==1&&cnt1[j]>=2){
cnt1[j]--;
}
else if(b[i].cnt2[j]==1&&cnt1[j]<2){
flag=0;
// cout<<j<<endl;
}
}
// for(int j=1;j<=n;j++)cout<<cnt1[j];
// cout<<endl;
// for(int j=1;j<=n;j++)cout<<b[i].cnt2[j];
// cout<<endl;
if(flag==1){
c++;
}
else{
for(int j=1;j<=n;j++)cnt1[j]=pre[j];
}
}
cout<<c<<'\n';
for(int i=1;i<=n;i++){
cnt1[i]=0;
}
for(int i=1;i<=m;i++)b[i].knt=0;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++)b[i].cnt2[j]=0;
}
}
return 0;
}
/*
1
5 5 15 3
0 3 0
12 4 0
1 1 0
5 5 0
6 4 0
2 5 8 9 15
*/