90pts WA#8调崩了呜呜呜
查看原帖
90pts WA#8调崩了呜呜呜
541634
littlebug楼主2024/8/9 23:36

有哪位大佬可以说说 #8 是为什么会 WA 吗?/kel

或者不用管我写了什么东西,说说 #8 数据卡了什么可以吗?/kel

#include<iostream>
#include<cstdio>
#include<vector>
#include<bitset>
#include<algorithm>
//#define int long long
#define ll long long
#define pb emplace_back
#define il inline
#define cerr if(0)cerr
using namespace std;

struct edge{int v;ll w;};
struct army{ll d;int id;};

const int MAXN=5e4+5,MAXlg=16+2; //15.6098
int n,m;
vector <edge> p[MAXN];
int a[MAXN],b[MAXN],fa[MAXN][MAXlg],tot;
ll dep[MAXN],res[MAXN];
vector <army> sp;
vector <int> nd;
bitset <MAXN> ckd,use;
army nst[MAXN];

il void dfs(int u,int ufa)
{
    fa[u][0]=ufa;
    for(edge i:p[u])
    {
        if(i.v==ufa) continue;
        dep[i.v]=dep[u]+i.w;
        dfs(i.v,u);
    }
}

il void init_fa()
{
    for(int i=1;i<=16;++i)
        for(int j=1;j<=n;++j)
            fa[j][i]=fa[fa[j][i-1]][i-1];
}

il int query(int u,ll lim)
{
    for(int i=16;i>=0;--i)
        if(dep[u]-dep[fa[u][i]]<=lim && fa[u][i]>1)
            u=fa[u][i];
    return u;
}

il bool dfs2(int u,int ufa)
{
    if(ckd[u]) return 1;
    if(p[u].size()==1 && p[u][0].v==ufa) return 0;

    int cnt=0;
    for(edge i:p[u])
    {
        if(i.v==ufa) continue;
        if(dfs2(i.v,u)) ++cnt;
    }

    if(cnt==p[u].size()-1) ckd[u]=1;
    return ckd[u];
}

il bool check(ll x)
{
    cerr<<"------------------- "<<x<<'\n';

    for(int i=1;i<=m;++i) b[i]=query(a[i],x),res[i]=x-(dep[a[i]]-dep[b[i]]);
    vector<army>().swap(sp),vector<int>().swap(nd);
    ckd&=0,use&=0;
    for(edge i:p[1]) nst[i.v].d=(ll)(9e18),nst[i.v].id=-1;

    for(int i=1;i<=m;++i)
    {
        if(fa[b[i]][0]==1)
        {
            //cerr<<"+";
            if(res[i]-dep[b[i]]>=0) sp.pb((army){res[i]-dep[b[i]],i});
            if(res[i]-dep[b[i]]<nst[b[i]].d) nst[b[i]]=(army){res[i]-dep[b[i]],i};
        }
        else ckd[b[i]]=1;
    }
    sort(sp.begin(),sp.end(),[](const army a,const army b)
    {
        return a.d>b.d;
    });

    cerr<<ckd[8]<<ckd[7]<<ckd[4]<<'\n';
    cerr<<"{sp} ";for(army i:sp) cerr<<"("<<i.d<<" "<<i.id<<") ";cerr<<'\n';

    dfs2(1,0);
    for(edge i:p[1])
        if(!ckd[i.v]) nd.pb(i.v);
    sort(nd.begin(),nd.end(),[](const int a,const int b)
    {
        return dep[a]>dep[b];
    });

    cerr<<"{nd} ";for(int i:nd) cerr<<i<<' ';cerr<<'\n';
    cerr<<"{nst} ";for(int i:nd)cerr<<"("<<i<<" "<<"{"<<nst[i].d<<","<<nst[i].id<<"}"<<") ";cerr<<'\n';

    int j=0;
    for(int i:nd)
    {
        if(nst[i].id>0 && !use[nst[i].id]) use[nst[i].id]=1;
        else
        {
            while(j<sp.size() && use[sp[j].id]) ++j;
            if(j==sp.size() || sp[j].d<dep[i]) return 0;
            use[sp[j++].id]=1;
        }
    }

    return 1;
}

signed main()
{
    ios::sync_with_stdio(0);
    ios_base::sync_with_stdio(0);
    cin.tie(nullptr);
    cout.tie(nullptr);

    cin>>n;
    int _u,_v;ll _w,l=0,r=0,mid;
    for(int i=1;i<=n-1;++i)
    {
        cin>>_u>>_v>>_w;
        p[_u].pb((edge){_v,_w});
        p[_v].pb((edge){_u,_w});
        if(_u==1 || _v==1) ++tot;
        r+=_w;
    }
    cin>>m;
    for(int i=1;i<=m;++i) cin>>a[i];

    if(tot>m){cout<<-1; return 0;}

    dfs(1,0);
    init_fa();
    //cerr<<"{dep} ";for(int i=1;i<=n;++i) cerr<<dep[i]<<' ';cerr<<'\n';

    //cerr<<check(9);return 0;

    bool res;
    r+=10ll;
    while(l+1ll<r)
    {
        mid=(l+r)>>1;
        res=check(mid);
        cerr<<"check result is "<<mid<<' '<<res<<"\n\n";
        if(res) r=mid;
        else l=mid;
    }

    cout<<r;

    return 0;
}

(不要管我代码里面的cerr喵)

2024/8/9 23:36
加载中...