如题
#include<bits/stdc++.h>
using namespace std;
int T,n,m,L,V,b[100005],ans1,ans2;
const int INF=1e6+5;
struct node{
int d,v,a;
int ost,ose;//超速起始点&超速终点
}a[100005];
bool cmp(node x,node y){
return x.ose<y.ose;
}
void input(){
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
ans1=0,ans2=0;
cin>>n>>m>>L>>V;
for(int i=1;i<=n;i++){
int in_d,in_v,in_a;
cin>>in_d>>in_v>>in_a;
a[i].d=in_d;
a[i].v=in_v;
a[i].a=in_a;
if(in_a==0){
if(in_v>V) a[i].ost=in_d,a[i].ose=INF;//从d处开始超速,到INF停止
else a[i].ost=-1,a[i].ose=-1;//不会超速
}
else if(in_a>0){//加速度为正
if(in_v>V) a[i].ost=in_d-1;
else a[i].ost=in_d+floor( (V*V-in_v*in_v)/(in_a*2.0) );//从此处超速
if(a[i].ost>L) a[i].ost=-1,a[i].ose=-1;
a[i].ose=INF;//到INF停止
}
else{
if(in_v>V){
a[i].ost=in_d;//如果初速度大于限速,从上高速的一刻起超速
double tmp=(double)(V*V-in_v*in_v)/(2.0*in_a);
a[i].ose=in_d+floor(tmp);//从此处结束超速
if(a[i].ose>=L) a[i].ose=L;
}
else a[i].ost=-1,a[i].ose=INF;//如果初速度小于限速且加速度为负,则一直不超速
}
}
for(int i=1;i<=m;i++){
cin>>b[i];
}
sort(b+1,b+1+m);
}
void solve1(){
for(int i=1;i<=n;i++){
if(a[i].ost==-1) continue;//如果完全不会超速,跳过该车辆
if(a[i].a==0){
if(b[m]>=a[i].d) ans1++;//匀速直线运动
}
else if(a[i].a>0){//加速
if(a[i].ost<b[m]) ans1++;//如果最后一个测速点在超速时刻后,则这个车辆会被检测
}
else{//减速
int l=1,r=m,mid,ans=-1;
while(l<=r){
int mid=(l+r)/2;
if(b[mid]>=a[i].ost){//大于区间开头
r=mid-1;
ans=mid;
}
else l=mid+1;
}
if(ans!=-1 && b[ans]<=a[i].ose) ans1++;
}
}
}
void solve2(){
int R=0;
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++){
if(a[i].a>=0){
if(a[i].ost==-1) continue;
if(a[i].ost<=R) continue;
R=a[i].ose;
ans2++;
}
else{
if(a[i].ost==-1) continue;
if(a[i].ost<=R) continue;
int l=1,r=m,mid,ans=-1;
while(l<=r){
mid=(l+r)/2;
if(b[mid]<=a[i].ose){
l=mid+1;
ans=mid;
} else {
r=mid-1;
}
}
if(ans!=-1 && b[ans]>=a[i].ost){
R=b[ans];
ans2++;
}
}
}
}
int main(){
freopen("detect.in","r",stdin);
freopen("detect.out","w",stdout);
cin>>T;
while(T--){
input();
solve1();
solve2();
cout<<ans1<<' '<<m-ans2<<endl;
}
}
尤其是a<0时大样例答案就多0~2