社区讨论

求助

学术版参与者 3已保存回复 14

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
14 条
当前快照
1 份
快照标识符
@mhiza3xi
此快照首次捕获于
2025/11/03 18:09
4 个月前
此快照最后确认于
2025/11/03 18:39
4 个月前
查看原帖
2024csp-s,t2 大样例全过,下载测试点第一个一模一样,提交0分?提示Wrong answer,Too short on line 2,求助各位大佬
CPP
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
const int M=1e6+20;
struct node{
    int l,r;
    bool operator <(const node& a) const{
        if(r==a.r)return l<a.l;
        return r<a.r;
    };
};
int t;
int d[N]={},v[N]={},a[N]={},vis[N]={},vis1[M]={},sum[M]={},p[N]={};
double s[N]={};
node b[N]={};
inline int read(){
    int x=0,f=1;
    char ch=getchar();
    while (ch<'0' || ch>'9') {
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while (ch>='0' && ch<='9') {
        x=(x<<1)+(x<<3)+ch-'0';
        ch=getchar();
    }
    return x*f;
}
int main(){
    cin>>t;
    while(t--){
        int n,m,L,V;
        cin>>n>>m>>L>>V;
        for(int i=1;i<=n;i++){
            d[i]=read();v[i]=read();a[i]=read();
            if(a[i]>0){
                if(v[i]<=V)s[i]=((V*V-v[i]*v[i])*1.0)/(2*a[i]*1.0);
            }else{
                if(v[i]>V)s[i]=((V*V-v[i]*v[i])*1.0)/(2*a[i]*1.0);
            }
        }
        for(int i=1;i<=m;i++){
            cin>>p[i];
            vis1[p[i]]++;
        }
        for(int i=1;i<=M;i++)sum[i]=sum[i-1]+(vis1[i]>0);
        for(int i=1;i<=n;i++){//处理超速区间
            if(a[i]==0){
                if(v[i]>V){
                    b[i].l=d[i];b[i].r=L;
                }else {
                    vis[i]=1;
                    b[i].l=b[i].r=0;
                }
            }else if(a[i]>0){
                if(v[i]>V){
                    b[i].l=d[i];b[i].r=L;
                }else{
                    b[i].l=floor(d[i]+s[i]+1);b[i].r=L;
                }
            }else{
                if(v[i]>V){
                    b[i].l=d[i];b[i].r=ceil(d[i]+s[i]-1);
                }else {
                    vis[i]=1;
                    b[i].l=b[i].r=0;
                }
            }
        }
        int ans=0;
        for(int i=1;i<=n;i++){
            if(vis[i] || b[i].r<b[i].l)continue;
            if(sum[b[i].r]-sum[b[i].l-1]>0)ans++;
            else {
                vis[i]=1;
                b[i].l=b[i].r=0;
            }
        }
        sort(b+1,b+1+n);
        int k=0,cnt=0;
        p[0]=0;
        for(int i=1;i<=n;i++){
            if(b[i].l>b[i].r || !b[i].l || !b[i].r)continue;
            if(b[i].l>p[k]){
                int l=1,r=m;
                while (l<=r) {
                    int mid=(l+r)>>1;
                    if(p[mid]<=b[i].r){
                        l=mid+1;k=mid;
                    }else{
                        r=mid-1;
                    }
                }
                cnt++;
            }
        }
        cout<<ans<<" "<<m-cnt<<endl;
        for(int i=1;i<=N;i++)d[i]=a[i]=v[i]=vis[i]=p[i]=0;
        for(int i=1;i<=M;i++)vis1[i]=sum[i]=0;
    }
    return 0;
}


回复

14 条回复,欢迎继续交流。

正在加载回复...