md为啥我没用#include<vector>tmd在dev能编译通过啊?????
妈的为什么没虚拟机????
阿啊啊啊啊啊啊啊啊 废了
我要晕过去了
#include<iostream>
#include<cstdio>
#include<utility>
#include<algorithm>
#include<cmath>
#define MP make_pair
#define pb emplace_back
#define endl '\n'
using namespace std;
namespace INPUT{
char buf[1<<20],*p1,*p2;
#define gc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++)
}
using namespace INPUT;
template<typename T>
T read(){
T x=0,p=1;
char ch=gc();
for(;ch<'0'||ch>'9';ch=gc())
if(ch=='-') p=-1;
for(;ch>='0'&&ch<='9';ch=gc())
x=(x<<3)+(x<<1)+(ch^48);
return x*p;
}
#define db double
int x(db v,db a,db V,int l,int r) { //2ax+v*v>V*V min
int mid;
while(l<r){
mid=(l+r)/2;
if(a*2*mid+v*v>V*V) r=mid;
else l=mid+1;
}
return l;
}
int x2(db v,db a,db V,int l,int r) { //2ax+v*v>V*V max
int mid;
while(l<r){
mid=(l+r+1)/2;
if(a*2*mid+v*v>V*V) l=mid;
else r=mid-1;
}
return l;
}
const int N=1e5+5,M=1e6+5;
vector<pair<int,int>> car;
vector<pair<int,int>> tmp;
bool cmp_car(pair<int,int>& a,pair<int,int>& b){
if(a.second!=b.second) return a.second<b.second;
return a.first>b.first;
}
int n,m,L;db V;
pair<int,int> check(db d,db v,db a){
if(a==0){
if(v<=V) return MP(-1,0);
return MP(d,L);
}
if(a>0){
if(v>V) return MP(d,L);
int d1=d+x(v,a,V,0,L-d+1);
// int d1=d+ceil((V*V-v*v)/(a*2));
if(d1>L) return MP(-1,0);
return MP(d1,L);
}
if(a<0){
if(v<=V) return MP(-1,0);
int d2=d+x2(v,a,V,0,L-d+1);
// int d2=d+floor((V*V-v*v)/(a*2));
if(d2>L) d2=L;
return MP(d,d2);
}//���check����д
return {233,233};
}
vector<int>monitor;
int checked_car,used_monitor;
bool vis[N];
int cnt_monitor[M];
void solve(){//�ǵü����գ���������������
checked_car=0,used_monitor=0;
monitor.clear(),car.clear();
n=read<int>(),m=read<int>(),L=read<int>();
V=read<int>();
for(int i=0;i<=n;i++) vis[i]=0;
for(int i=1;i<=L;i++) cnt_monitor[i]=0;
for(int d,v,a,i=1;i<=n;i++){
d=read<int>(),v=read<int>(),a=read<int>();
pair<int,int> sq=check(d,v,a) ;
if(sq.first!=-1) car.pb(sq);
}
n=car.size();
for(int i=1;i<=m;i++) monitor.pb(read<int>());
sort(monitor.begin(),monitor.end());
for(auto p:monitor) cnt_monitor[p]++;
for(int i=1;i<=L;i++) cnt_monitor[i]+=cnt_monitor[i-1];
for(int i=0;i<n;i++){
pair<int,int> ed=car[i];
if(cnt_monitor[ed.second]-cnt_monitor[ed.first-1])
checked_car++,vis[i]=1;
}
tmp.clear();
for(int i=0;i<n;i++)
if(vis[i]) tmp.pb(car[i]);
swap(car,tmp);
//����ȥ�� ������ ���
sort(car.begin(),car.end(),cmp_car);
tmp.clear();
for(auto ed:car){
if(tmp.empty()||tmp.back().first<ed.first)
tmp.pb(ed);
}
swap(car,tmp);
// debug
// cout<<car.size()<<endl;
// for(auto ed:car) cout<<ed.first<<' '<<ed.second<<endl;
// for(auto p:monitor) cout<<p<<' ';
// cout<<endl;
int tim=-1,R=-1;
for(auto ed:car){
int l=ed.first,r=ed.second;
if(l>R) {
while(tim+1<m&&monitor[tim+1]<=r) tim++;
// cout<<"use "<<monitor[tim]<<endl;
R=monitor[tim];
used_monitor++;
}
// cout<<tim<<endl;
}
cout<<checked_car<<' '<<m-used_monitor<<endl;
}
int main(){
freopen("detect.in","r",stdin);
freopen("detect.out","w",stdout);
int T=read<int>();
while(T--) solve();
}