30pts求助
查看原帖
30pts求助
523808
Fe1ix_HeXinYu楼主2023/3/3 20:03
#include<bits/stdc++.h>
using namespace std;

#define printf(...) printf

#define int long long

const int N=0x100'400;

int idx=2,h[N],e[N*2],ne[N*2];

inline void ned(int a,int b) {
    ne[idx]=h[a];
    e[idx]=b;
    h[a]=idx++;
}

inline void nd(int a,int b) {
    ned(a,b);
    ned(b,a);
}

#define fos(i,x) for(int ed=h[x],i=e[ed];ed;i=e[ed=ne[ed]])

int n,r[N],ht[N],ans,vis[N],dp[N][2],never;

void dfs(int x,int val) {
    printf("#%d\n",x);

    vis[x]=val;

    dp[x][0]=0;
    dp[x][1]=r[x];

    fos(i,x)
        if(vis[i]!=val) {
            dfs(i,val);

            dp[x][0]+=max(dp[i][0],dp[i][1]);
            dp[x][1]+=dp[i][0];
        }

    if(x==never) dp[x][1]=-1e9;
    printf("#%d: dp[0]=%d, dp[1]=%d\n",x,dp[x][0],dp[x][1]);
}

void test_output() {
    printf("unchose #%d\n",never);
    for(int i=1;i<=n;i++)
        if(vis[i]);
    printf("\n");
}

int work(int x) {
    int now=x,ans=0;

    while(vis[now]!=-x) {
        vis[now]=-x;
        now=ht[now];
    }

    int root=ht[now];

    printf("del line %d->%d\n",now,root);
    printf("root #%d\n",now);
    never=now;
    dfs(now,now);
    test_output();
    ans=max(dp[now][0],dp[now][1]);

    never=root;
    dfs(now,root);
    test_output();
    ans=max(dp[now][0],dp[now][1]);

    return ans;
}

signed main() {
    cin>>n;

    for(int i=1;i<=n;i++) {
        cin>>r[i]>>ht[i];
        ned(ht[i],i);
    }

    for(int i=1;i<=n;i++)
        if(!vis[i])
            ans+=work(i);

    cout<<ans<<endl;

    return 0;
}
/*

5
2 2
3 3
1 1
4 2
5 3

*/
2023/3/3 20:03
加载中...