社区讨论
请求添加题解(新算法?
P11232[CSP-S 2024] 超速检测参与者 3已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @m32vtijl
- 此快照首次捕获于
- 2024/11/04 18:32 去年
- 此快照最后确认于
- 2025/11/04 15:22 4 个月前
rt
CPP#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+5, M = 1e6+5;
int T, n, m, l, v, ans, mn, sz, st, s[M], t[M], p[N], dp[M];
struct node{
int d, v, a, l, r, f;
} c[N];
struct npd{
int l, r;
bool operator >(const npd &b) const{
if(l != b.l) return l < b.l;
return r < b.r;
}
} x[N];
bool cmp(npd x, npd y){
if(x.r != y.r) return x.r < y.r;
return x.l < y.l;
}
int main(){
//freopen("detect.in", "r", stdin);
//freopen("detect.out", "w", stdout);
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin>>T;
while(T--){
memset(s, 0, sizeof(s));
memset(t, 0, sizeof(t));
memset(dp, 0, sizeof(dp));
mn = 1e9, ans = 0, sz = 0, st = 0;
cin>>n>>m>>l>>v;
bool f1 = 0, f2 = 0, f3 = 0;
for(int i = 1; i <= n; i++) c[i].f = 0, c[i].l = c[i].r = -1;
for(int i = 1; i <= n; i++){
cin>>c[i].d>>c[i].v>>c[i].a;
if(c[i].a != 0) f1 = 1;
if(c[i].a > 0) f2 = 1;
if(c[i].a < 0) f3 = 1;
if(c[i].a <= 0 && c[i].v <= v) continue;
if(c[i].a == 0) c[i].l = c[i].d, c[i].r = l;
else{
double t = 1.0 * fabs((v - c[i].v)) / fabs(c[i].a) * 1.0;
if(c[i].a > 0){
if(c[i].v > v) c[i].l = c[i].d, c[i].r = l;
else{
double len = t * (1.0 * v + c[i].v) / 2.0 + c[i].d;
if(int(len) + 1 <= l) c[i].l = int(len) + 1, c[i].r = l;
}
}
else{
double len = t * (1.0 * v + c[i].v) / 2.0 + c[i].d;
c[i].l = c[i].d, c[i].r = min(int(ceil(len) - 1), l);
}
}
}
for(int i = 1; i <= m; i++){
cin>>p[i];
t[p[i]] = 1;
}
for(int i = 1; i <= l; i++) t[i] += t[i-1];
for(int i = 1; i <= n; i++){
int num;
if(c[i].l == 0) num = 0;
else num = t[c[i].l-1];
if(c[i].l >= 0 && c[i].r >= 0 && t[c[i].r] - num > 0) c[i].f = 1, ans++, x[++sz] = {c[i].l, c[i].r}, st = max(st, c[i].l);
}
cout<<ans<<" ";
if(f1 == 0 || f3 == 0){
if(ans == 0) cout<<m<<"\n";
else cout<<m-1<<"\n";
continue;
}
sort(x+1, x+1+sz, cmp);
int j = 1, k = 1;
priority_queue<npd, vector<npd>, greater<npd> > q;
for(int i = 1; i <= m; i++){
while(j <= sz && x[j].r < p[i]) q.push((npd){x[j].l, x[j].r}), j++;
while(k < i && !q.empty() && p[k] < q.top().l) k++;
if(!q.empty() && k < i){
int tmp = 1e9;
for(int ll = k; ll < i; ll++) tmp = min(tmp, dp[ll]);
dp[i] = tmp + 1;
}
else dp[i] = 1;
}
st = lower_bound(p+1, p+1+m, st) - p;
for(int i = st; i <= m; i++) mn = min(mn, dp[i]);
if(ans != 0) cout<<m - mn<<"\n";
else cout<<m<<"\n";
}
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...