社区讨论

WA80分 #3#4错误求调

P11232[CSP-S 2024] 超速检测参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@m373vu3u
此快照首次捕获于
2024/11/07 17:29
去年
此快照最后确认于
2024/11/07 17:51
去年
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int t;
int n,m,L,V;
struct car{
	int d,v,a;
	double st,ed;
}c[100005];
struct sb{
	double s,e,nu;	
	friend bool operator <(sb ala,sb alb){
		return ala.e<alb.e;
	}
}d[100005];
int p[100005];
int ans=0;
int cnt=0;
int tmp;
int main(){
	//freopen("detect.in","r",stdin);
	//freopen("detect.out","w",stdout);
	scanf("%d",&t);
	while(t--){
		memset(c,0,sizeof(c));
		memset(p,0,sizeof(p));
		memset(d,0,sizeof(d));
		ans=0;
		cnt=0;
		scanf("%d %d %d %d",&n,&m,&L,&V);
		for(int i=1;i<=n;i++){
			scanf("%d %d %d",&c[i].d,&c[i].v,&c[i].a);
			if(c[i].a<=0&&c[i].v<=V){
				i--;
				n--;
			}
		}
		for(int i=1;i<=m;i++){
			scanf("%d",&p[i]);
		}
		for(int i=1;i<=n;i++){
			if(c[i].a==0){
				c[i].st=c[i].d;
				c[i].ed=L+1;
			}else{
				if(c[i].v>V){
					if(c[i].a>0){
						c[i].st=c[i].d-0.001;
						c[i].ed=L+1;
						continue;
					}
					double p=(V*V-c[i].v*c[i].v)*1.0/(2*c[i].a)+c[i].d;
					if(p>L+1){
						c[i].st=c[i].d-0.001;
						c[i].ed=L+1;
						continue;
					}
					c[i].st=c[i].d-0.001;
					c[i].ed=p;	
				}
				if(c[i].v<=V){
					double p=(V*V-c[i].v*c[i].v)*1.0/(2*c[i].a)+c[i].d;
					if(p>L+1){
						c[i].st=L+1;
						c[i].ed=L+1;
						continue;
					}
					c[i].st=p;
					c[i].ed=L+1;	
				}
			}
		}
		sort(p+1,p+m+1);
		for(int i=1;i<=n;i++)
		{
			int l=1,r=m;
			int mid=0;
			bool flag=0;
			while(r>=l){
				mid=(l+r)/2;
				if(p[mid]>=c[i].ed){
					r=mid-1;
				}else if(p[mid]<=c[i].st){
					l=mid+1;
				}else{
					flag=1;
					//cout<<i<<" ";
					break;
				}
			}
			if(flag){
				d[++cnt].s=c[i].st;
				d[cnt].e=c[i].ed;
			}
		}
		/*tmp=0;
		for(int i=1;i<=cnt;i++){
			if(d[i].e>L)tmp++;
		}
		if(cnt==0){
			cout<<cnt<<" "<<m<<"\n";
			continue;
		}
		if(tmp==cnt){
			cout<<cnt<<" "<<m-1<<"\n";
			continue;
		}*/
		n=cnt;
		int pans=0;
		sort(d+1,d+n+1);
		for(int i=1;i<=n;i++){
			if(p[pans]>=d[i].s){
				continue;
			}else{
				ans++;
				int l=1,r=m;
				while(r>=l){
					int mid=(l+r)/2;
					if(p[mid]<d[i].e){
						l=mid+1;
						pans=mid;
					}else{
						r=mid-1;
					}
				}
			}
		}
		printf("%d %d\n",cnt,m-ans);
	}	
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...