社区讨论

30pts求调

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

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@m49gvf33
此快照首次捕获于
2024/12/04 13:47
去年
此快照最后确认于
2025/11/04 13:22
4 个月前
查看原帖

思路:贪心+二分

CPP
#include<bits/stdc++.h>
using namespace std;
#define ll long long
struct C{
	int d,v,a;
}w[100010];
struct check{
	int lt,rt;
}t[100010];
bool cmp(check A,check B){
	return A.rt<B.rt;
}
int p[100010];
int T;
int n,m,L,V,sum,ans;
int bs1(int x){
	int lt=1,rt=m;
	while(lt<rt){
		int mid=(lt+rt)/2;
		if(p[mid]<x) lt=mid+1;
		else rt=mid; 
	}
	return lt;
}
int bs2(int a,int b,int c){
	int lt=1,rt=m;
	while(lt<rt){
		int mid=(lt+rt)/2;
		if(sqrt(pow(b,2)*1.0+2*c*(p[mid]-a))>V) rt=mid;
		else lt=mid+1; 
	}
	return lt;
}
int bs3(int a,int b,int c){
	int lt=1,rt=m;
	while(lt<rt){
		int mid=(lt+rt+1)/2;
		if(sqrt(pow(b,2)*1.0+2*c*(p[mid]-a))>V) lt=mid;
		else rt=mid-1; 
	}
	return lt;
}
int main(){
	cin>>T;
	while(T--){
		memset(w,0,sizeof(w));
		memset(t,0,sizeof(t));
		memset(p,0,sizeof(p));
		sum=0,ans=0;
		scanf("%d %d %d %d",&n,&m,&L,&V);
		for(int i=1;i<=n;i++) scanf("%d %d %d",&w[i].d,&w[i].v,&w[i].a);
		for(int i=1;i<=m;i++) scanf("%d",&p[i]);
		for(int i=1;i<=n;i++){
			if(!w[i].a){
				if(w[i].v>V) t[i].lt=bs1(w[i].d),t[i].rt=m;
			}else if(w[i].a>0){
				if(bs2(w[i].d,w[i].v,w[i].a)<=m) t[i].lt=bs2(w[i].d,w[i].v,w[i].a),t[i].rt=m;
			}else if(w[i].v>V && sqrt(pow(w[i].v,2)*1.0+2.0*w[i].a*(p[bs1(w[i].d)]-w[i].d))>V){
				if(bs3(w[i].d,w[i].v,w[i].a)) t[i].lt=bs1(w[i].d),t[i].rt=bs3(w[i].d,w[i].v,w[i].a);
			}
			if(t[i].lt) sum++;
		}
		sort(t+1,t+n+1,cmp);
		int r=0;
		for(int i=1;i<=n;i++){
			if(t[i].lt>r && t[i].lt){
				ans++;
				r=t[i].rt;
			}
		}
		cout<<sum<<" "<<m-ans<<endl;
	}
	return 0;
}

回复

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

正在加载回复...