社区讨论

60玄关求调

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

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mhjax6qg
此快照首次捕获于
2025/11/03 23:35
4 个月前
此快照最后确认于
2025/11/03 23:35
4 个月前
查看原帖
RT
主播已经没招了,调了俩小时了
应该是第一问出了问题,和答案差个1、2
CPP
#include <bits/stdc++.h>
using namespace std;

const int N=1e5+10;
const int L_=1e6+10;

int t,n,m,L,V;
int d[N],v[N],a[N];
int p[N],pre[L_],l[L_];
bool f[N];
struct node{
	int l;
	int r;
};
node s[N];

bool cmp(node x,node y){
	return x.l<y.l||x.l==y.l&&x.r>y.r;
}

int main (){
	
//	freopen("P11232_5.in","r",stdin);
	
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	
	cin >> t;
	while(t--){
		
		int sum=0,cnt=0,ans=0;
		
		cin >> n >> m >> L >> V;
		for(int i=1;i<=n;i++) cin >> d[i] >> v[i] >> a[i];
		for(int i=1;i<=m;i++) {
			cin >> p[i];
			pre[p[i]]++,l[p[i]]=p[i];
		}
		for(int i=1;i<=L;i++) {
			if(!l[i]) l[i]=l[i-1];
			pre[i]+=pre[i-1];
		}
		
		for(int i=1;i<=n;i++){
			if(a[i]==0){
				if(v[i]>V&&pre[L]-pre[d[i]-1]){
					sum++;
					s[++cnt].l=d[i],s[cnt].r=L;
				}
			}else if(a[i]>0){
				if(v[i]>V&&pre[L]-pre[d[i]-1]){
					sum++;
					s[++cnt].l=d[i],s[cnt].r=L;
				}else{
					double x=double(V*V-v[i]*v[i])/double(2*a[i]);
					if(x+d[i]>L) continue;
					if(pre[L]-pre[int(ceil(x+d[i]))-1]) {
						sum++;
						s[++cnt].l=ceil(x+d[i]),s[cnt].r=L;
					}
				}
			}else{
				if(v[i]<=V) continue;
				double x=double(V*V-v[i]*v[i])/double(2*a[i]);
				int tmp=x+d[i];
				if(tmp>L) tmp=L;
				if(pre[tmp]-pre[d[i]-1]) {
					sum++;
					s[++cnt].l=d[i],s[cnt].r=tmp;
				}
			}
		}
		
		cout << sum << ' ';
		
		sort(s+1,s+cnt+1,cmp);
		
		int minn=0x3f3f3f3f;
		for(int i=cnt;i>=1;i--)
			if(s[i].r<minn) minn=s[i].r,f[i]=true;
		int rt=-1;
		for(int i=1;i<=cnt;i++){
			if(f[i]&&rt<s[i].l){
				ans++;
				rt=l[s[i].r];
			}
		}
		
		cout << m-ans << '\n';
		
		for(int i=1;i<=n;i++)
			d[i]=a[i]=v[i]=f[i]=s[i].l=s[i].r=0;
		for(int i=1;i<=m;i++) p[i]=0;
		for(int i=0;i<=L;i++) pre[i]=l[i]=0;
		
	}
	
	return 0;
}
代码有点抽象

回复

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

正在加载回复...