WA on #2求调
查看原帖
WA on #2求调
522981
海洋守卫者楼主2024/11/7 10:07

90pts WA on #2

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#define int long long
using namespace std;
const int MAXN=1e5+7;
int T,n,m,L,V,N,ans,sum;
struct Car{
	int d,v,a;
}c[MAXN];
int p[MAXN],l,r,f[MAXN];
bool used;
bool cmp(Car A,Car B)
{
	return A.d>B.d;
}
signed main()
{
	//freopen("detect.in","r",stdin);
	//freopen("detect.out","w",stdout);
	scanf("%lld",&T);
	while(T--)
	{
		sum=0,ans=0,used=0;
		memset(f,0,sizeof f);
		scanf("%lld %lld %lld %lld",&n,&m,&L,&V);
		for(int i=1;i<=n;i++)scanf("%lld %lld %lld",&c[i].d,&c[i].v,&c[i].a);
		for(int i=1;i<=m;i++)scanf("%lld",p+i);
		sort(p+1,p+1+m);l=0,r=0;
		sort(c+1,c+1+n,cmp);
		for(int i=n,j=1;i;i--)
		{
			while(c[i].d>p[j]&&j<=m)j++;
			if(j>m)break;
			f[i]=j;N=i;
		}
		//for(int i=1;i<=n;i++)printf("%lld %lld\n",c[i].d,p[f[i]]);
		for(int i=1;i<=n;i++)
		{
			if(!f[i])continue;
			bool check=0;
			if(c[i].a==0)
			{
				if(c[i].v>V)
				{
					sum++,check=1;
					if(l+r==0)l=r=m,ans++;
					else if(p[r]<c[i].d)ans++,r=m;
				}
			}
			else if(c[i].a>0)
			{
				int tmp=V*V-c[i].v*c[i].v+c[i].a*c[i].d*2ll;
				if(l+r==0&&tmp<2ll*c[i].a*p[m])sum++,ans++,l=r=m;
				else if(r&&tmp<2ll*c[i].a*p[r])sum++,check=1;
				else if(tmp<2ll*c[i].a*p[m])sum++,ans++,r=m;
			}
			else if(c[i].a<0)
			{
				if(c[i].v<V)continue;
				int A=-c[i].a;
				int tmp=c[i].v*c[i].v-V*V+2ll*c[i].d*A;
				if(l+r==0&&tmp>p[f[i]]*2ll*A)sum++,ans++,l=r=f[i];
				else if(tmp>p[l]*2ll*A)sum++,check=1;
				else if(tmp>p[f[i]]*2ll*A)sum++,ans++,l=min(f[i],l),r=max(r,f[i]),check=1;
			
		}
		printf("%lld %lld\n",sum,m-ans);
	}
	return 0;
}
2024/11/7 10:07
加载中...