应该是ai>0的地方写错了,但本人找不出错,求调,感谢!!!
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
#define int long long
int T;
int n,m,L,V;
struct Node{
int d,v,a;
double s;
}car[100010];
int p[100010];
struct node{
int l,r;
};
vector<node>lmt;
bool cmp(node a,node b)
{
return a.l<b.l;
}
signed main()
{
// freopen("detect.in","r",stdin);
// freopen("detect.out","w",stdout);
scanf("%lld",&T);
while(T--)
{
while(!lmt.empty())lmt.pop_back();
scanf("%lld%lld%lld%lld",&n,&m,&L,&V);
int opt1=0,opt2=0;
for(int i=1;i<=n;i++)
{
scanf("%lld%lld%lld",&car[i].d,&car[i].v,&car[i].a);
if(car[i].a!=0)
{
car[i].s=(V*V*1.0-car[i].v*car[i].v*1.0)*1.0/(car[i].a<<1);
car[i].s+=car[i].d*1.0;
}
}
for(int i=1;i<=m;i++)
cin>>p[i];
sort(p+1,p+m+1);
for(int i=1;i<=n;i++)
{
if(car[i].a==0)
{
if(car[i].v<=V)
{
continue;
}
int to=m;
int from=lower_bound(p+1,p+m+1,car[i].d)-p;
if(from<=to)
{
opt1++;
lmt.push_back({from,to});
}
}
else if(car[i].a<0)
{
int to=lower_bound(p+1,p+m+1,car[i].s)-p;
to--;
int from=lower_bound(p+1,p+m+1,car[i].d)-p;
if(from<=to)
{
opt1++;
lmt.push_back({from,to});
}
}
else if(car[i].a>0)
{
int from=lower_bound(p+1,p+m+1,car[i].s)-p;
if((p[from]-car[i].d)*(car[i].a<<1)==(V*V-car[i].v*car[i].v))from++;
int to=m;
if(from<=to)
{
opt1++;
lmt.push_back({from,to});
}
}
}
sort(lmt.begin(),lmt.end(),cmp);
int nowl=-1,nowr=-1;
for(int i=0;i<opt1;i++)
{
if((lmt[i].l>=nowl&&lmt[i].l<=nowr)||(lmt[i].r>=nowl&&lmt[i].r<=nowr))
{
nowl=max(nowl,lmt[i].l);
nowr=min(nowr,lmt[i].r);
}
else
{
opt2++;
nowl=lmt[i].l;
nowr=lmt[i].r;
}
}
printf("%lld %lld\n",opt1,m-opt2);
}
// fclose(stdin);
// fclose(stdout);
return 0;
}
/*
*/