玄关求助
查看原帖
玄关求助
1007282
hehaorui楼主2025/6/29 12:58

WA on #4 #6 #8 #10

#include<bits/stdc++.h>
using namespace std;
const int N=1e5;
int t;
int n,m,l,V;
int d[N],p[N];
int v[N],a[N];
struct node{
	int l,r;
};
node sp[N];
bool cmp(node x,node y)
{
	if(x.r==y.r)
		return x.l<y.l;
	return x.r<y.r;
}
int read()
{
	int sum=0;
	char a=getchar();
	int f=1;
	while(a<'0'||a>'9')
	{
		if(a=='-')
			f=-1;
		a=getchar();
	}
	while(a>='0'&&a<='9')
	{
		sum=sum*10+a-'0';
		a=getchar();
	}
	return sum*f;
 } 
int main()
{
//	freopen("hhr.in","r",stdin);
//	freopen("hhr.out","w",stdout); 
	t=read();
//	cout<<"t="<<t<<"\n";
	while(t--)
	{
		n=read(),m=read(),l=read(),V=read();
		for(int i=1;i<=n;i++)
			d[i]=read(),v[i]=read(),a[i]=read();
		for(int i=1;i<=m;i++)
			p[i]=read();
		sort(p+1,p+1+m);
		int cnt=0;
		for(int i=1;i<=n;i++)
		{
			if(d[i]>p[m])
				continue;
			if(a[i]>0)
			{
				if(v[i]<=V)
				{
					double s=1.0*(V*V-v[i]*v[i])/(2*a[i]);
					int l=1,r=m;
					int res=0;
					if(1.0*d[i]+s>=p[m])
						continue;
					while(l<=r)
					{
						int mid=(l+r)>>1;
						if(p[mid]<=1.0*d[i]+s)
							res=mid,l=mid+1;
						else
							r=mid-1;
					}
//					cout<<1<<"\n";
					if(res+1<=m)
						sp[++cnt]={res+1,m};
				}
				else
				{
					int l=1,r=m;
					int res=0;
					while(l<=r)
					{
						int mid=(l+r)>>1;
						if(p[mid]<d[i])
							res=mid,l=mid+1;
						else
							r=mid-1;
					}
					if(res+1<=m) 
						sp[++cnt]={res+1,m};
					
				}
			}
			else if(a[i]<0)
			{
				if(v[i]<=V)
					continue;
				double s=1.0*(V*V-v[i]*v[i])/(2*a[i]);
//				cout<<"s="<<s<<"\n";
//				cout<<"V="<<V<<" v[i]="<<v[i]<<"\n";
				int res=0;
				int l=1,r=m;
				if(d[i]>p[m])
					continue;
				while(l<=r)
				{
					int mid=(l+r)>>1;
					if(p[mid]<d[i])
						res=mid,l=mid+1;
					else
						r=mid-1;
				} 
				int ll=res+1,rr;
				l=1,r=m;
				res=0;
//				cout<<d[i]*1.0+s<<"\n";
				while(l<=r)
				{
					int mid=(l+r)>>1;
					if(p[mid]<d[i]*1.0+s)
						res=mid,l=mid+1;
					else
						r=mid-1;
				}
				rr=res;
				if(ll<=rr)
					sp[++cnt]={ll,rr};
//				cout<<"i="<<i<<"\n";
//				cout<<sp[cnt].l<<" "<<sp[cnt].r<<"\n"; 
			}
			else if(v[i]>V)
			{
				int l=1,r=m;
				int res=0;
				if(d[i]>p[m])
					continue;
				while(l<=r)
				{
					int mid=(l+r)>>1;
					if(p[mid]<d[i])
						res=mid,l=mid+1;
					else
						r=mid-1;
				}
				if(res+1<=m)
					sp[++cnt]={res+1,m};
			}
		}
		cout<<cnt<<" ";
		sort(sp+1,sp+1+cnt,cmp);
//		for(int i=1;i<=cnt;i++)
//			cout<<sp[i].l<<" "<<sp[i].r<<"\n";
		int ans=0;
		int last=0;
		for(int i=1;i<=cnt;i++)
		{
			if(sp[i].l<=last)
				continue;
			last=sp[i].r;
			ans++;
		}
		cout<<m-ans<<"\n";
	}
	return 0;
}
2025/6/29 12:58
加载中...