社区讨论
已过存疑求解
P11232[CSP-S 2024] 超速检测参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mhj0gyjm
- 此快照首次捕获于
- 2025/11/03 18:42 4 个月前
- 此快照最后确认于
- 2025/11/03 18:42 4 个月前
rt,
CPP#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef long double db;
struct P{
db l,r;
bool operator<(const P t)const {
if (r!=t.r) return r<t.r;
return l<t.l;
}
} edge[100005];
int t;
int n,m,L,V;
int ans,tot;
int d[100005],v[100005],a[100005],p[100005];
int main (){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> t;
while (t--){
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];
}
tot=0;
for (int i=1;i<=n;i++){
// if (d[i]>p[m]) continue;
int l=1,r=m,mid;
int pos=0;
if (a[i]>0){
db s=(V*V-v[i]*v[i])*1.0/(2.0*a[i]);
while (l<=r){
mid=(l+r)/2;
if (p[mid]-d[i]>s){
pos=mid;
r=mid-1;
}else {
l=mid+1;
}
}
if (!pos) continue;
edge[++tot].l=pos;
edge[tot].r=m;
}else {
if (v[i]<=V) continue;
while (l<=r){
mid=(l+r)/2;
if (p[mid]>=d[i]){
pos=mid;
r=mid-1;
}else {
l=mid+1;
}
}
if (!pos) continue;
l=pos,r=m;
int ans=0;
while (l<=r){
mid=(l+r)/2;
db v1=sqrt(1.0*v[i]*v[i]+2.0*a[i]*(p[mid]-d[i]));
if (v1>V){
ans=mid;
l=mid+1;
}else {
r=mid-1;
}
}
if (ans<pos) continue;
edge[++tot].l=pos;
edge[tot].r=ans;
}
}
cout << tot << ' ';
sort(edge+1,edge+tot+1);
int lst=-1;
ans=0;
for (int i=1;i<=tot;i++){
if (edge[i].l<=lst) continue;
lst=edge[i].r;
ans++;
}
cout << m-ans << endl;
}
return 0;
}
这份代码只能得到 80pts,但将注释掉的这行加上就能ac了,想知道这是为什么。
回复
共 2 条回复,欢迎继续交流。
正在加载回复...