社区讨论

WA on #6 求调

P11232[CSP-S 2024] 超速检测参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@m38cgrlw
此快照首次捕获于
2024/11/08 14:17
去年
此快照最后确认于
2025/11/04 15:08
4 个月前
查看原帖
RT
CPP
#include<bits/stdc++.h>
using namespace std;
int T,n,m,l,v,ans1=0,ans2,wz[100005],qz[1000005];
bitset<1000005> jk;
struct hh{
	int d,v,a,f;
}ca[100005];
struct wahh{
	int l,r;
}qj[100005];
inline int xs(long double x){
	return (int)x+1;
}
inline int xx(long double x){
	if(x==(int)(x)){
		return (int)(x)-1;
	}
	return (int)(x);
}
inline int cz(int x){
	int l=1,r=m;
	while(l<=r){
		int mid=l+r>>1;
		if(wz[mid]<x){
			l=mid+1;
		}else{
			r=mid-1;
		}
	}
	return l;
} 
inline int cy(int x){
	int l=1,r=m;
	while(l<=r){
		int mid=l+r>>1;
		if(wz[mid]>x){
			r=mid-1;
		}else{
			l=mid+1;
		}
	}
	return r;
}
bool cmp(wahh x,wahh y){
	return x.r<y.r;
}
int main(){
	scanf("%d",&T);
	while(T--){
		memset(qz,0,sizeof(qz));
		jk.reset();
		ans1=0;
		ans2=0;
		scanf("%d%d%d%d",&n,&m,&l,&v);
		for(int i=1;i<=n;++i){
			scanf("%d%d%d",&ca[i].d,&ca[i].v,&ca[i].a);
			ca[i].f=0;
		}
		for(int i=1,x;i<=m;++i){
			scanf("%d",&wz[i]);
			jk[wz[i]]=1;
		}
		for(int i=1;i<=l;++i){
			qz[i]=qz[i-1]+jk[i];
		}
		for(int i=1;i<=n;++i){
			if(ca[i].a==0){
				if(ca[i].v>v&&qz[l]-qz[ca[i].d-1]>0){
					ans1++;
					ca[i].f=1;
					qj[ans1]={cz(ca[i].d),cy(l)};
				}
			}else if(ca[i].a<0){
				if(ca[i].v>v){
					int js=ca[i].d*1.0+xx((long double)(v*v-ca[i].v*ca[i].v)/2.0/ca[i].a);
					if(js>0&&qz[min(l,js)]-qz[ca[i].d-1]>0){
						ca[i].f=1;
						ans1++;
						qj[ans1]={cz(ca[i].d),cy(min(l,js))};
					}
				}
			}else{
				if(ca[i].v>v&&qz[l]-qz[ca[i].d-1]>0){
					ans1++;
					ca[i].f=1;
					qj[ans1]={cz(ca[i].d),cy(l)};
				}else{
					int ks=ca[i].d*1.0+xs((long double)(v*v-ca[i].v*ca[i].v)/2.0/ca[i].a);
					if(ks<=l&&qz[l]-qz[max(ca[i].d,ks)]>0){
						ca[i].f=1;
						ans1++;
						qj[ans1]={cz(max(ca[i].d,ks)+1),cy(l)};
					}
				}
			}
		}
		int zr=-1;
		sort(qj+1,qj+ans1+1,cmp);
		for(int i=1;i<=ans1;i++){
			if(zr<qj[i].l){
				zr=qj[i].r;
				ans2++;
			}
		}
		printf("%d %d\n",ans1,m-ans2);
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...