蒟蒻求助!
查看原帖
蒟蒻求助!
161748
ssilrrr楼主2023/1/6 10:32

rt,40分,AC+WA,不知道错哪了。

#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define int long long
const int N=1e6+10;
int n;
vector<tuple<int,int,int>> g[N];//v w id
int rd[N],vis[N],v2[N],v3[N],f[N],l[N];
int sum[N<<1],st[N<<1],ls[N<<1],L,R;
queue<int> q;
vector<tuple<int,int,int>> h;// u v w
void sring(int u){
    v2[u]=true;
    for(auto p:g[u]){
        auto [i,w,id]=p;
        if(!vis[i]&&!v3[id]){
            v3[id]=1;
            h.push_back({u,i,w});
            sring(i);
        }
    }
}
signed main(){
    ios::sync_with_stdio(0);
    cin>>n;
    rep(i,1,n){
        int v,w;cin>>v>>w;
        g[i].push_back({v,w,i});
        g[v].push_back({i,w,i});
    }
    rep(i,1,n){
        rd[i]=g[i].size();
        if(rd[i]==1){
            q.push(i);
        }
    }

    while(!q.empty()){
        int t=q.front();q.pop();
        vis[t]=true;
        for(auto p:g[t]){
            auto [v,w,id]=p;
            if(vis[v])continue;
            rd[v]--;
            if(rd[v]==1)q.push(v);
            l[v]=max(l[v],f[v]+f[t]+w);
            l[v]=max(l[v],l[t]);
            f[v]=max(f[v],f[t]+w);
        }
    }
    int ansl=0;
    rep(i,1,n){
        if(!vis[i]&&!v2[i]){
            int ans=0;
            h.clear();
            sring(i);
            for(auto p:h){
                auto [u,v,w]=p;
                ans=max(ans,l[u]);
            }
            for(int i=1;i<=2*h.size();i++){
                st[i]=get<0>(h[(i-1)%h.size()]);
                sum[i+1]=sum[i]+get<2>(h[(i-1)%h.size()]);
            }
            L=1;R=0;
            auto gi=[](int w){return f[get<0>(h[(w-1)%h.size()])]-sum[w];};
            auto gk=[](int w){return f[get<0>(h[(w-1)%h.size()])]+sum[w];};
            rep(i,1,2*h.size()){
                //cout<<gi(ls[R])<<' '<<gi(i)<<endl;
                while(L<=R&&gi(ls[R])<=gi(i))R--;
                while(L<=R&&(ls[L]<i-h.size()+1))L++;
                if(L<=R){
                    ans=max(ans,gk(i)+gi(ls[L]));
                }
                ls[++R]=i;
            }
            ansl+=ans;
        }
    }cout<<ansl;   
}
2023/1/6 10:32
加载中...