60pt,求调
查看原帖
60pt,求调
1163591
c22j33c43楼主2024/10/28 16:45

60pt,帮看看问题在哪?

#include<bits/stdc++.h>
using namespace std;
int n,m,V,l,v[100001],d[100001],ce,t,p[100001],ans1,ans2;
double s;
struct book{
	double a,mx,mn;
}q[100001];
inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
inline bool cmp(book b,book c){
	if(b.mx==c.mx) return b.mn<c.mn;
	return b.mx<c.mx;
}
int main(){
	//freopen("1.in","r",stdin);
	t=read();
	for(int i=1;i<=t;i++){
		n=read();m=read();l=read();V=read();
		memset(q,0,sizeof(q));
		int inf=l+1;
		for(int j=1;j<=n;j++){
			d[j]=read();
			v[j]=read();
			q[j].a=read();
		}
		for(int j=1;j<=m;j++) p[j]=read();
		for(int j=1;j<=n;j++){
			if(q[j].a==0){
				if(V<v[j]){
					q[j].mn=d[j];
					if(q[j].mn<=p[m]){
						q[j].mx=p[m];
						ans1++;
					}
					else q[j].mn=0;
				}
			}
			else if(q[j].a>0){
				s=(V*V-v[j]*v[j])*1.0/(2*q[j].a);	
				q[j].mn=d[j]+(s>=0?s:-1);
				if(q[j].mn<p[m]){
					q[j].mx=p[m];
					ans1++;
				}
				else q[j].mn=0;
			}
			else if(q[j].a<0){
				s=(V*V-v[j]*v[j])*1.0/(2*q[j].a);	
				if(v[j]>V){
					q[j].mn=d[j];
					q[j].mx=d[j]+s;
				}
			}
		}
		sort(q+1,q+n+1,cmp);
		int u=m;
		for(int j=n;j;j--){
			if(q[j].a>=0) continue;
			if(q[j].mn==0&&q[j].mx==0) continue;
			int o=0;
			while(inf){
				if(q[j].mn>p[u]){
					u++;
					break;
				}
				if(q[j].mn<=p[u]&&q[j].mx>p[u]){
					q[j].mx=p[u];
					ans1++;
					o=1;
					break;
				}
				u--;
			}
			if(o==0){
				q[j].mn=0;
			    q[j].mx=0;
			}
		}
		sort(q+1,q+n+1,cmp);
		for(int j=1;j<=n;j++){
			if(q[j].mn==0&&q[j].mx==0) continue;
			if(q[j].a<=0&&q[j].mn<=ce) continue;
			if(q[j].a>0&&q[j].mn<ce) continue;
			ce=q[j].mx;
			ans2++;
		}
		printf("%d %d\n",ans1,m-ans2);
		ans1=0;
		ans2=0;
		ce=0;
	}
	return 0;
}
2024/10/28 16:45
加载中...