60pts #1 #6 #8 #10
查看原帖
60pts #1 #6 #8 #10
1069617
zqf114楼主2024/11/23 22:44

如题

#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

2024/11/23 22:44
加载中...