80ptsWA悬6关求调
查看原帖
80ptsWA悬6关求调
658762
sxq9楼主2025/7/21 16:22

rt,大概是精度问题

#include<bits/stdc++.h>
#define eps 0.000000001
#define int long long
using namespace std;
struct node{
    double l,r;
}c[100010];
double pos[100010];
int del[100010],chao[100010],used[100010];
bool cmp(node a,node b){
    if(a.l==b.l)return a.r<b.r;
    return a.l<b.l;
}
main(){
     ios::sync_with_stdio(false);
     cin.tie(0);
     cout.tie(0);
    int t;
    cin>>t;
    while(t--){
        memset(pos,0,sizeof(pos));
        memset(del,0,sizeof(del));
        memset(chao,0,sizeof(chao));
        memset(used,0,sizeof(used));
        int n,m;
        double len,v,d,sp,a;
        cin>>n>>m>>len>>v;
        for(int i=1;i<=n;i++){
            cin>>d>>sp>>a;
            if(sp>v&&a>0)c[i].l=d,c[i].r=len;
            else if(sp>v&&a<0)c[i].l=d,c[i].r=min(len,d+(v*v-sp*sp)/2.0/a-eps);
            else if(sp<=v&&a>0)c[i].l=min(len,(d+(v*v-sp*sp)/2.0/a)+eps),c[i].r=len+eps;
            else if(a==0){
                if(sp<=v)c[i].l=-100,c[i].r=-100;
                else c[i].l=d,c[i].r=len+eps;
            }
            else c[i].l=-1,c[i].r=-1;
            // cout<<c[i].l<<' '<<c[i].r<<endl;
        }
        for(int i=1;i<=m;i++)cin>>pos[i];
        sort(c+1,c+n+1,cmp);
        // for(int i=1;i<=n;i++){
        //     cout<<c[i].l<<' '<<c[i].r<<endl;
        // }
        int now=1,ans=0,ans2=0;
        for(int i=1;i<=n;i++){
            while(pos[now]<c[i].l&&now<=m)now++;
            if(now>m)break;
            if(c[i].r>=pos[now]){
                ans++;
                chao[i]=1;
            }
        }
        cout<<ans<<' ';
        double minr=len+100;
        for(int i=n;i>=1;i--){
            if(c[i].r>=minr)del[i]=1;
            if(chao[i]==1)minr=min(minr,c[i].r);
//            cout<<"del["<<i<<"] ="<<del[i]<<endl;
           // cout<<minr<<' '<<i<<' '<<chao[i]<<endl;
        }
        now=1;
        int lst=0;
        for(int i=1;i<=n;i++){
            if(del[i]==1||chao[i]==0)continue;
            if(pos[used[lst]]>=c[i].l&&pos[used[lst]]<=c[i].r){
                used[i]=used[lst];
                lst=i;
                continue;
            }
            while(pos[now]<=c[i].r&&now<=m)now++;
            used[i]=--now;
            ans2++;
//            cout<<now<<' ';
            lst=i;
            // cout<<endl<<i<<' '<<used[i]<<endl;
        }
        cout<<m-ans2<<'\n';
    }
	return 0;
}
2025/7/21 16:22
加载中...