代码如下,跟按考场上的思路写的,大样例全过,现在好怕考场代码爆掉
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int t,n,m,L,V;
int ans1,ans2,d[N],v[N],a[N],p[N];
struct node{
int l,r;
}f[N];
bool cmp(node x,node y){
if(x.r == y.r) return x.l<y.l;
else return x.r<y.r;
}
void get_ans(){
sort(f+1,f+ans1+1,cmp);
int lst=0;
//for(int i=1;i<=ans1;i++) cout<<f[i].l<<" "<<f[i].r<<endl;
for(int i=1;i<=ans1;i++){
if(f[i].l>lst) lst=f[i].r,ans2++;
}
printf("%d %d\n",ans1,m-ans2);
}
void work(){
ans1=ans2=0;
scanf("%d%d%d%d",&n,&m,&L,&V);
for(int i=1;i<=n;i++){
scanf("%d%d%d",&d[i],&v[i],&a[i]);
}
for(int i=1;i<=m;i++){
scanf("%d",&p[i]);
}
for(int i=1;i<=n;i++){
if(d[i]>p[m]) continue;
if(v[i]>V && a[i]>=0){
f[++ans1].l = lower_bound(p+1,p+m+1,d[i])-p;
f[ans1].r = m;
}
else if(a[i]>0){
int dd = floor(1.0*(pow(V,2)-pow(v[i],2))/a[i]/2);
if(d[i]+dd>=p[m]) continue;
int pos = lower_bound(p+1,p+m+1,d[i]+dd-1)-p;
f[++ans1].l = pos,f[ans1].r = m;
}
else if(a[i]<0){
int pos = lower_bound(p+1,p+m+1,d[i])-p;
if(pow(v[i],2)+2*a[i]*(p[pos]-d[i])<0)continue;
else{
if(sqrt(pow(v[i],2)+2*a[i]*(p[pos]-d[i]))<=V) continue;
}
int dd = ceil(1.0*(pow(V,2)-pow(v[i],2))/a[i]/2);
f[++ans1].l=pos;
pos = lower_bound(p+1,p+m+1,d[i]+dd)-p-1;
f[ans1].r=pos;
}
}
get_ans();
}
int main(){
//freopen("detect1.in","r",stdin);
//freopen("ans.ans","w",stdout);
scanf("%d",&t);
while(t--){
work();
}
return 0;
}