社区讨论

囚鯈(40pts)(悬inf关)

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

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mhizsy3a
此快照首次捕获于
2025/11/03 18:23
4 个月前
此快照最后确认于
2025/11/03 18:23
4 个月前
查看原帖
代码感觉思路没问题,但是改不出来
CPP
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 5;
int n, m, L, V, p[N], ans = 0, ciu;
struct node{
	int d, v, a;
}a[N];
struct CxL{
	int l, r;
}b[N];
bool cmp(CxL a, CxL b){
	if(a.l == b.l)return a.r < b.r;
	return a.l < b.l;
}
//bool ClvL(int i){
//	for(int j = 1; j <= m; j++){
//		if(vis[j])continue;
//		if(a[i].v * a[i].v + 2 * (p[j] - a[i].d) * a[i].a > V * V){
//			return true;
//		}
//	}
//	return false;
//}
//int YandG(){
//	int as = 0;
//	for(int i = 1; i <= n; i++){
//		if(ClvL(i)){
//			as++;
//		}
//	}
//	return as;
//}
signed main(){
	int t;cin >> t;while(t--){
		ans = ciu = 0;
		memset(b, -1, sizeof(b));
		cin >> n >> m >> L >> V;
		for(int i = 1; i <= n; i++){
			cin >> a[i].d >> a[i].v >> a[i].a;
		}
		for(int i = 1; i <= m; i++){
			cin >> p[i];
		}
		sort(p + 1, p + m + 1);
		for(int i = 1; i <= n; i++){
			if(a[i].a >= 0){
				if(a[i].v * a[i].v + 2 * (p[m] - a[i].d) * a[i].a > V * V && a[i].d <= p[m]){
					ans++;
					b[i].r = m;
					if(a[i].a == 0 || a[i].v > V){
						b[i].l = lower_bound(p + 1, p + m + 1, a[i].d) - p;
					}else{
						int yfh = (V * V - a[i].v * a[i].v) / (2 * a[i].a);
						b[i].l = upper_bound(p + 1, p + m + 1, a[i].d + yfh) - p;
					}
				}
			}else{
				if(a[i].v > V && a[i].d <= p[m]){
					int gbq = lower_bound(p + 1, p + m + 1, a[i].d) - p;
					if(a[i].v * a[i].v + 2 * a[i].a * (p[gbq] - a[i].d) > V * V){
						ans++;
						b[i].l = gbq;
						int zyb = (V * V - a[i].v * a[i].v) / (2 * a[i].a);
						if(zyb * (2 * a[i].a) != (V * V - a[i].v * a[i].v)){
							zyb++;
						}
						b[i].r = lower_bound(p + 1, p + m + 1, a[i].d + zyb) - p - 1;
						if(b[i].l > L){
							b[i].l = b[i].r = -1;
						}else{
							b[i].r = m;
						}
					}
				}
			}
//			cout << b[i].l << " " << b[i].r << "\n";
		}
		sort(b + 1, b + n + 1, cmp);
		int rz = -1, mj = 0;
		for(int i = 1; i <= n; i++){
			if(b[i].l == -1)continue;
			if(rz < b[i].l){
				rz = b[i].r;
				mj++;
			}
		}
		cout << ans << " " << m - mj << "\n";
	}
	return 0;
}

回复

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

正在加载回复...