60 求调
查看原帖
60 求调
1438995
Mylights楼主2024/10/29 13:15

考场上没做出来,现在思路参照这篇题解

#include <bits/stdc++.h>
using namespace std;

constexpr int DATASIZE = 1e6+5;

struct car{
	int d, v, a;
} cars[DATASIZE];

int p[DATASIZE];
pair<int,int> segm[DATASIZE];
bool stat[DATASIZE];

int n, m, L, V;
bool check_(int car_i, int p_i){
	int d = cars[car_i].d;
	if(d > p[p_i]) return false;
	int a = cars[car_i].a;
	int s = p[p_i] - d;
	int v = cars[car_i].v;
	return v * v + 2 * a * s > V * V;
}

bool comp(pair<int,int> a, pair<int,int> b){
	if(a.first == b.first) return a.second > b.second;
	return a.first < b.first;
}

void solve(){
	int n_seg = 0;
	cin >> n >> m >> L >> V;
	for(int i = 0; i < n; i++) cin >> cars[i].d >> cars[i].v >> cars[i].a;
	for(int i = 0; i < m; i++) cin >> p[i];
	for(int i = 0; i < n; i++){
		if(cars[i].d > p[m-1]) continue;
		int l = 0, r = m - 1;
		if(cars[i].a >= 0){
			if(!check_(i, r)) continue;
			l = upper_bound(p, p+m, i, check_) - p;
		}else{
			l = lower_bound(p, p+m, cars[i].d) - p;
			if(!check_(i, l)) continue;
			r = lower_bound(p, p+m, i, check_) - p - 1;
		}
		segm[++n_seg] = {l, r};
	}
	
	sort(segm, segm+n_seg, comp);
	int front = 1e9;
	for(int i = n_seg-1; i >= 0; i--){
		if(segm[i].second < front){
			front = segm[i].second;
			stat[i] = true;
		}else{
			stat[i] = false;
		}
	}
	front = -1;
	int kept = 0;
	for(int i = 0; i < n_seg; i++) if(stat[i] && front < segm[i].first){
		kept++; front = segm[i].second;
	}
	cout << n_seg << ' ' << m - kept << '\n';
}

signed main(){
//	freopen("detect.in", "r", stdin);
//	freopen("detect.out", "w", stdout);
	int t;
	cin >> t;
	while(t--) solve();
	return 0;
}

改了几个小时了,跪求大佬帮忙调

2024/10/29 13:15
加载中...