60pt,帮看看问题在哪?
#include<bits/stdc++.h>
using namespace std;
int n,m,V,l,v[100001],d[100001],ce,t,p[100001],ans1,ans2;
double s;
struct book{
double a,mx,mn;
}q[100001];
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*10+ch-48;ch=getchar();}
return x*f;
}
inline bool cmp(book b,book c){
if(b.mx==c.mx) return b.mn<c.mn;
return b.mx<c.mx;
}
int main(){
//freopen("1.in","r",stdin);
t=read();
for(int i=1;i<=t;i++){
n=read();m=read();l=read();V=read();
memset(q,0,sizeof(q));
int inf=l+1;
for(int j=1;j<=n;j++){
d[j]=read();
v[j]=read();
q[j].a=read();
}
for(int j=1;j<=m;j++) p[j]=read();
for(int j=1;j<=n;j++){
if(q[j].a==0){
if(V<v[j]){
q[j].mn=d[j];
if(q[j].mn<=p[m]){
q[j].mx=p[m];
ans1++;
}
else q[j].mn=0;
}
}
else if(q[j].a>0){
s=(V*V-v[j]*v[j])*1.0/(2*q[j].a);
q[j].mn=d[j]+(s>=0?s:-1);
if(q[j].mn<p[m]){
q[j].mx=p[m];
ans1++;
}
else q[j].mn=0;
}
else if(q[j].a<0){
s=(V*V-v[j]*v[j])*1.0/(2*q[j].a);
if(v[j]>V){
q[j].mn=d[j];
q[j].mx=d[j]+s;
}
}
}
sort(q+1,q+n+1,cmp);
int u=m;
for(int j=n;j;j--){
if(q[j].a>=0) continue;
if(q[j].mn==0&&q[j].mx==0) continue;
int o=0;
while(inf){
if(q[j].mn>p[u]){
u++;
break;
}
if(q[j].mn<=p[u]&&q[j].mx>p[u]){
q[j].mx=p[u];
ans1++;
o=1;
break;
}
u--;
}
if(o==0){
q[j].mn=0;
q[j].mx=0;
}
}
sort(q+1,q+n+1,cmp);
for(int j=1;j<=n;j++){
if(q[j].mn==0&&q[j].mx==0) continue;
if(q[j].a<=0&&q[j].mn<=ce) continue;
if(q[j].a>0&&q[j].mn<ce) continue;
ce=q[j].mx;
ans2++;
}
printf("%d %d\n",ans1,m-ans2);
ans1=0;
ans2=0;
ce=0;
}
return 0;
}