社区讨论
40pts求调(样例可过)
P11232[CSP-S 2024] 超速检测参与者 4已保存回复 20
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 20 条
- 当前快照
- 1 份
- 快照标识符
- @mhj3wl4i
- 此快照首次捕获于
- 2025/11/03 20:18 4 个月前
- 此快照最后确认于
- 2025/11/03 20:46 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
int t,n,m,l,V,ans1,ans2;
const int N=1e5+5;
int d[N],v[N],a[N],p[N],f[N];
int getmin(int x){
int l=1,r=m,mid;
while(l<r){
mid=(l+r)>>1;
if(p[mid]<=d[x]){
l=mid+1;
}else r=mid;
}
return l;
}
struct node{
int lp,rp;
};
vector<node>vt;
bool cmp(node x,node y){return x.lp==y.lp?x.rp<y.rp:x.lp<y.lp;}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>t;
while(t--){
cin>>n>>m>>l>>V;
ans1=0;ans2=0;
vt.clear();
for(int i=1;i<=n;i++){
cin>>d[i]>>v[i]>>a[i];
f[i]=0;
}
for(int i=1;i<=m;i++){
cin>>p[i];
f[i]=0;
}
double vv;
for(int i=1;i<=n;i++){
if(d[i]>p[m])continue;
if(a[i]>0){
vv=sqrt(v[i]*v[i]+2*a[i]*(p[m]-d[i]));
}else if(a[i]==0){
vv=v[i];
}else{
int pos=getmin(i);
if(pos<=m){
vv=sqrt(v[i]*v[i]+2*a[i]*(p[pos]-d[i]));
}else{
vv=v[i];
}
}
if(vv>V){
ans1++;
f[i]=1;
}
}
for(int i=1;i<=n;i++){
if(!f[i])continue;
if(a[i]>0){
int l=1,r=m,pos;
while(l<=r){
int mid=(l+r)>>1;
vv=sqrt(v[i]*v[i]+2*a[i]*(p[mid]-d[i]));
if(vv>V){
pos=mid;
r=mid-1;
}else{
l=mid+1;
}
}
if(pos<=m)vt.push_back({pos,m});
}else if(a[i]==0){
if(v[i]>V){
int pos=getmin(i);
if(pos<=m)vt.push_back({pos,m});
}
}else{
int p1=getmin(i);
if(p1>m)continue;
int l=p1,r=m,p2;
while(l<=r){
int mid=(l+r)>>1;
double current_v=sqrt(v[i]*v[i]+2*a[i]*(p[mid]-d[i]));
if(current_v>V){
p2=mid;
l=mid+1;
}else{
r=mid-1;
}
}
if(p2<=m)vt.push_back({p1,p2});
}
}
sort(vt.begin(),vt.end(),cmp);
for(unsigned int i=0;i<vt.size();i++){
if(i==0)ans2=1;
else{
if(vt[i].lp>vt[i-1].rp)ans2++;
}
}
cout<<ans1<<' '<<m-ans2<<'\n';
}
return 0;
}
思路:
对于第一个答案,我的想法是分三类讨论,分别是:
第一种我的想法是贪心,因为它的速度会一直增加,所以就看它到最后一个测速仪的时候有没有超速。
第二种直接判断速度有没有超(因为速度不会变,且前面已经判断过是否超过了最后一个测速仪)。
第三种也是贪心,二分找到离它最近的测速仪然后判断有没有超速。
对于第二个答案,也是分和上面一样的三类,用二分和贪心来找到能测出它超速的测速仪的区间,最后在用贪心来求解。
第一种我的想法是贪心,因为它的速度会一直增加,所以就看它到最后一个测速仪的时候有没有超速。
第二种直接判断速度有没有超(因为速度不会变,且前面已经判断过是否超过了最后一个测速仪)。
第三种也是贪心,二分找到离它最近的测速仪然后判断有没有超速。
对于第二个答案,也是分和上面一样的三类,用二分和贪心来找到能测出它超速的测速仪的区间,最后在用贪心来求解。
调了2个2.5h了,救救蒟蒻吧qwq
回复
共 20 条回复,欢迎继续交流。
正在加载回复...