考场上没做出来,现在思路参照这篇题解
#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;
}
改了几个小时了,跪求大佬帮忙调