球条
查看原帖
球条
788881
ririTLE楼主2024/11/4 20:39

迷之错误
二分思路正确 code:

#include<bits/stdc++.h>
using namespace std;
int s,ch,T,n,m,L,V,p[100005],l=1,ans,savm;
bool sav[100005],f,B=1,A=1;
struct car{
	int d,v,a,e;
}c[100005];
bool cmp(car x,car y){
	return x.d<y.d;
}
bool cmp1(car x,car y){
	if(x.a>=0) return 0;
	if(y.a>=0) return 1;
	return 1ll*x.e*y.a+1ll*x.d*x.a*2*y.a<1ll*y.e*x.a+1ll*y.d*x.a*y.a*2;
}
inline int read(){
	s=0;ch=getchar();f=0;
	while(ch>'9'||ch<'0'){
		if(ch=='-') f=1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		s=(s<<1)+(s<<3)+ch-48;
		ch=getchar();
	}
	if(f) return -s;
	return s;
}
int main(){
	freopen("detect.in","r",stdin);
	freopen("detect.out","w",stdout);
	T=read();
	while(T--){
		n=read();m=read();L=read();V=read();ans=0;l=1;savm=0;B=1;A=1;
		for(int i=1;i<=n;i++){
			c[i].d=read();c[i].v=read();c[i].a=read();
			if(c[i].a<=0) B=0;
			if(c[i].a!=0) A=0;
		}
		for(int i=1;i<=m;i++) p[i]=read();
		if(A){
			for(int i=1;i<=n;i++){
				if(c[i].v>V&&c[i].d<=p[m]) ans++;
			}
			if(ans==0) printf("0 %d\n",m);
			else printf("%d %d\n",ans,m-1);
			continue;
		}
		if(B){
			for(int i=1;i<=n;i++){
				if(1ll*2*c[i].a*(p[m]-c[i].d)+c[i].v*c[i].v>V*V&&c[i].d<=p[m]) ans++;
			}
			if(ans==0) printf("0 %d\n",m);
			else printf("%d %d\n",ans,m-1);
			continue;
		}
		for(int i=1;i<=m;i++) sav[i]=0;
		sort(c+1,c+1+n,cmp);
		for(int i=1;i<=n;i++){
			if(c[i].a!=0) c[i].e=V*V-c[i].v*c[i].v;
			else if(c[i].v>V&&c[i].d<=p[m]){
				ans++;
			}
		}
		sort(c+1,c+1+n,cmp1);p[m+1]=1000000005;
		for(int i=1;i<=m;i++){
			while(l<=n){
				if(c[l].a>=0||c[l].e>0||c[l].e+1ll*c[l].d*2*c[l].a>1ll*p[i]*2*c[l].a){
					l++;continue;
				}		if(c[l].e+1ll*c[l].d*c[l].a*2<1ll*p[i]*c[l].a*2&&c[l].e+1ll*c[l].d*c[l].a*2>=1ll*p[i+1]*c[l].a*2&&c[l].d<=p[i]){
					savm=i;sav[i]=1;ans++;l++;
					while(l<=n){
						if(c[l].a>=0||c[l].e>0||c[l].e+1ll*c[l].d*2*c[l].a>1ll*p[i]*2*c[l].a){
							l++;continue;
						}
						if(c[l].e+1ll*c[l].d*2*c[l].a<1ll*2*c[l].a*p[i]&&c[l].d<=p[i]) l++,ans++;
						else break;
					}
				}
				else break;
			}
		}
		if(!sav[m]){
			for(int i=1;i<=n;i++){
				if(c[i].a>0&&c[i].e+1ll*c[i].d*2*c[i].a>1ll*p[savm]*2*c[i].a&&c[i].e+1ll*c[i].d*2*c[i].a<=1ll*p[m]*2*c[i].a&&c[i].d<=p[m]){
					sav[m]=1;
				}
				if(c[i].a==0&&c[i].d<=p[m]&&c[i].d>p[savm]&&c[i].v>V) sav[m]=1;		if(c[i].a>0&&c[i].e+1ll*c[i].d*2*c[i].a<=1ll*p[m]*2*c[i].a&&c[i].d<=p[m]){
					ans++;
				}
			}
		}
		if(ans==0){
			printf("0 %d\n",m);continue;
		}
		printf("%d ",ans);ans=0;
		for(int i=1;i<=m;i++) if(!sav[i]){
			ans++;
		}
		printf("%d\n",ans);
	}
	return 0;
}
2024/11/4 20:39
加载中...