80pts未过大样例求调
查看原帖
80pts未过大样例求调
529229
lrmlrm_楼主2024/11/5 14:06

RT

80pts WA on #8 #10

没有过最后一个大样例

#include<bits/stdc++.h>
#define int long long
using namespace std;
int t,n,m,l,v,ans1,ans2,cnt,tot,ans22,ans23,ans24;
struct car{
	int d,v,a;
}s[100010];
struct quj{
	int l,r,carid;
}zk[100010];
struct qp{
	int l,r;
}tys[100010];
int p[100010];
int vis[100010];
bool cmp(qp ma,qp mi){
	if(ma.r!=mi.r)return ma.r<mi.r;
	return ma.l<mi.l;
}
bool cmp2(qp ma,qp mi){
	if(ma.l!=mi.l)return ma.l<mi.l;
	return ma.r<mi.r;
}
bool cmp5(quj ma,quj mi){
	if(ma.r!=mi.r)return ma.r<mi.r;
	return ma.l<mi.l;
}
bool cmp6(quj ma,quj mi){
	if(ma.l!=mi.l)return ma.l<mi.l;
	return ma.r<mi.r;
}
int find(int x){
	int l=1,r=m;
	while(l+1<r){
		int mid=(l+r)/2;
		if(p[mid]<=x)l=mid;
		else r=mid-1;
//		printf(" %d %d %d %d\n",x,l,r,mid);
	}
	if(p[l+1]<=x)l++;
	return l;
}
signed main(){
	scanf("%lld",&t);
	while(t--){
		ans1=0,ans2=0,cnt=0,tot=0,ans23=0,ans24=0;
		memset(vis,0,sizeof(vis));
		scanf("%lld%lld%lld%lld",&n,&m,&l,&v);
		for(int i=1;i<=n;i++){
			scanf("%lld%lld%lld",&s[i].d,&s[i].v,&s[i].a);
			if(s[i].a==0)
				if(s[i].v>v)
					zk[++cnt].l=s[i].d,zk[cnt].r=l,zk[cnt].carid=i;
			if(s[i].a>0){
				if(s[i].v>v)
					zk[++cnt].l=s[i].d,zk[cnt].r=l,zk[cnt].carid=i;
				else if(s[i].v*s[i].v+2*s[i].a*(l-s[i].d)>=v*v){
					double ls=(v*v*1.0-s[i].v*s[i].v*1.0)/(2.0*s[i].a);
					if(ls==(int)ls)ls+=1;
					zk[++cnt].l=ceil(ls+s[i].d),zk[cnt].r=l,zk[cnt].carid=i;
//					cout<<ls<<'\n';
				}
			}
			if(s[i].a<0)
				if(s[i].v>v){
					double rs=(v*v*1.0-s[i].v*s[i].v*1.0)/(2.0*s[i].a);
					if(rs==(int)rs)rs-=1;
					zk[++cnt].l=s[i].d,zk[cnt].r=min((int)floor(rs)+s[i].d,l),zk[cnt].carid=i;
				}
		}
		for(int i=1;i<=m;i++)
			scanf("%lld",&p[i]);
		p[m+1]=2147483647;
		if(n<=3000){
			sort(p+1,p+m+1);
			for(int i=1;i<=cnt;i++){
				int x=find(zk[i].l);
				if(p[x]<zk[i].l)x++;
				int y=find(zk[i].r);
//				printf(" %lld %lld %lld %lld\n",zk[i].l,zk[i].r,x,y);
				if(zk[i].l<=p[y]&&p[y]<=zk[i].r)
					ans1++,tys[++tot].l=x,tys[tot].r=y;
			}
			sort(tys+1,tys+tot+1,cmp);
			for(int i=1;i<=tot;i++){
				if(vis[i])continue;
				int ma=0,mas=0;
				for(int j=tys[i].l;j<=tys[i].r;j++){
					int sum=0;
					for(int k=i+1;k<=tot;k++)
						if(!vis[k]&&tys[k].l<=j&&j<=tys[k].r)
							sum++;
					if(sum>ma)ma=sum,mas=j;
				}
					for(int k=i;k<=tot;k++)
					if(tys[k].l<=mas&&mas<=tys[k].r)
						vis[k]=1;
				ans2++; 
			}
			printf("%lld %lld\n",ans1,m-ans2);
		}
		else{
			sort(zk+1,zk+cnt+1,cmp5);
			sort(p+1,p+m+1);
			for(int i=1;i<=cnt;i++){
				int x=p[find(zk[i].r)];
//				printf("%lld %lld %lld %lld %lld\n",i,zk[i].l,zk[i].r,zk[i].carid,x);
				if(zk[i].l<=x&&x<=zk[i].r){
					ans2++,ans1++;
					while(zk[i+1].l<=x&&x<=zk[i+1].r&&i+1<=cnt)
						i++,ans1++;
				}
			}
			sort(zk+1,zk+cnt+1,cmp6);
			for(int i=1;i<=cnt;i++){
				int x=p[find(zk[i].r)];
				if(zk[i].l<=x&&x<=zk[i].r){
					ans22++;
					while(zk[i+1].l<=x&&x<=zk[i+1].r&&i+1<=cnt)
						i++;
				}
			}
			printf("%lld %lld\n",ans1,m-min(ans2,ans22));
		}
	}
	return 0;
}
2024/11/5 14:06
加载中...