迷之错误
二分思路正确
code:
#include<bits/stdc++.h>
using namespace std;
int s,ch,T,n,m,L,V,p[100005],l=1,ans,savm;
bool sav[100005],f,B=1,A=1;
struct car{
int d,v,a,e;
}c[100005];
bool cmp(car x,car y){
return x.d<y.d;
}
bool cmp1(car x,car y){
if(x.a>=0) return 0;
if(y.a>=0) return 1;
return 1ll*x.e*y.a+1ll*x.d*x.a*2*y.a<1ll*y.e*x.a+1ll*y.d*x.a*y.a*2;
}
inline int read(){
s=0;ch=getchar();f=0;
while(ch>'9'||ch<'0'){
if(ch=='-') f=1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
s=(s<<1)+(s<<3)+ch-48;
ch=getchar();
}
if(f) return -s;
return s;
}
int main(){
freopen("detect.in","r",stdin);
freopen("detect.out","w",stdout);
T=read();
while(T--){
n=read();m=read();L=read();V=read();ans=0;l=1;savm=0;B=1;A=1;
for(int i=1;i<=n;i++){
c[i].d=read();c[i].v=read();c[i].a=read();
if(c[i].a<=0) B=0;
if(c[i].a!=0) A=0;
}
for(int i=1;i<=m;i++) p[i]=read();
if(A){
for(int i=1;i<=n;i++){
if(c[i].v>V&&c[i].d<=p[m]) ans++;
}
if(ans==0) printf("0 %d\n",m);
else printf("%d %d\n",ans,m-1);
continue;
}
if(B){
for(int i=1;i<=n;i++){
if(1ll*2*c[i].a*(p[m]-c[i].d)+c[i].v*c[i].v>V*V&&c[i].d<=p[m]) ans++;
}
if(ans==0) printf("0 %d\n",m);
else printf("%d %d\n",ans,m-1);
continue;
}
for(int i=1;i<=m;i++) sav[i]=0;
sort(c+1,c+1+n,cmp);
for(int i=1;i<=n;i++){
if(c[i].a!=0) c[i].e=V*V-c[i].v*c[i].v;
else if(c[i].v>V&&c[i].d<=p[m]){
ans++;
}
}
sort(c+1,c+1+n,cmp1);p[m+1]=1000000005;
for(int i=1;i<=m;i++){
while(l<=n){
if(c[l].a>=0||c[l].e>0||c[l].e+1ll*c[l].d*2*c[l].a>1ll*p[i]*2*c[l].a){
l++;continue;
} if(c[l].e+1ll*c[l].d*c[l].a*2<1ll*p[i]*c[l].a*2&&c[l].e+1ll*c[l].d*c[l].a*2>=1ll*p[i+1]*c[l].a*2&&c[l].d<=p[i]){
savm=i;sav[i]=1;ans++;l++;
while(l<=n){
if(c[l].a>=0||c[l].e>0||c[l].e+1ll*c[l].d*2*c[l].a>1ll*p[i]*2*c[l].a){
l++;continue;
}
if(c[l].e+1ll*c[l].d*2*c[l].a<1ll*2*c[l].a*p[i]&&c[l].d<=p[i]) l++,ans++;
else break;
}
}
else break;
}
}
if(!sav[m]){
for(int i=1;i<=n;i++){
if(c[i].a>0&&c[i].e+1ll*c[i].d*2*c[i].a>1ll*p[savm]*2*c[i].a&&c[i].e+1ll*c[i].d*2*c[i].a<=1ll*p[m]*2*c[i].a&&c[i].d<=p[m]){
sav[m]=1;
}
if(c[i].a==0&&c[i].d<=p[m]&&c[i].d>p[savm]&&c[i].v>V) sav[m]=1; if(c[i].a>0&&c[i].e+1ll*c[i].d*2*c[i].a<=1ll*p[m]*2*c[i].a&&c[i].d<=p[m]){
ans++;
}
}
}
if(ans==0){
printf("0 %d\n",m);continue;
}
printf("%d ",ans);ans=0;
for(int i=1;i<=m;i++) if(!sav[i]){
ans++;
}
printf("%d\n",ans);
}
return 0;
}