Submission #587468

# Submission time Handle Problem Language Result Execution time Memory
587468 2022-07-01T23:17:31 Z Bench0310 Training (IOI07_training) C++17
100 / 100
24 ms 16276 KB
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n,m;
    cin >> n >> m;
    vector<array<int,3>> unpaved_edges;
    vector<int> v[n+1];
    for(int i=1;i<=m;i++)
    {
        int a,b,c;
        cin >> a >> b >> c;
        if(c==0)
        {
            v[a].push_back(b);
            v[b].push_back(a);
        }
        else unpaved_edges.push_back({a,b,c});
    }
    vector<int> depth(n+1,0);
    vector<int> p(n+1,0);
    vector<int> ch[n+1];
    vector<int> ch_id(n+1,-1);
    function<void(int)> dfs=[&](int a)
    {
        depth[a]=depth[p[a]]+1;
        for(int to:v[a])
        {
            if(to==p[a]) continue;
            ch_id[to]=ch[a].size();
            ch[a].push_back(to);
            p[to]=a;
            dfs(to);
        }
    };
    dfs(1);
    int req=0;
    int cost_sum=0;
    vector<array<int,2>> edges={{0,0}};
    vector<int> cost={0};
    vector<array<int,3>> opt[n+1]; //child[ren],id
    vector<int> up_going[n+1];
    for(auto [a,b,c]:unpaved_edges)
    {
        if((depth[a]-depth[b])&1) req+=c;
        else
        {
            int id=edges.size();
            edges.push_back({a,b});
            cost.push_back(c);
            cost_sum+=c;
            int x=a,y=b;
            if(depth[x]>depth[y])
            {
                swap(a,b);
                swap(x,y);
            }
            int prv=0;
            while(depth[x]!=depth[y])
            {
                prv=y;
                y=p[y];
            }
            if(x!=y) //nice lca
            {
                while(p[x]!=p[y])
                {
                    x=p[x];
                    y=p[y];
                }
                up_going[a].push_back(id);
                up_going[b].push_back(id);
                opt[p[x]].push_back({x,y,id});
            }
            else //vertical path
            {
                up_going[b].push_back(id);
                opt[a].push_back({prv,0,id});
            }
        }
    }
    int e=(int)edges.size()-1;
    const int inf=(1<<29);
    vector dp(n+1,vector(e+1,int(-inf)));
    auto chmax=[&](int &a,int b){a=max(a,b);};
    vector<int> dp_closed(n+1,0);
    function<void(int)> solve=[&](int a)
    {
        for(int to:ch[a]) solve(to);
        int cnt=ch[a].size();
        vector<int> best((1<<cnt),0);
        for(int mask=0;mask<(1<<cnt);mask++)
        {
            for(auto [x,y,id]:opt[a])
            {
                int submask=(1<<ch_id[x]);
                if(y!=0) submask^=(1<<ch_id[y]);
                if((submask&mask)==submask) chmax(best[mask],best[mask^submask]+dp[x][id]+(y!=0?dp[y][id]:0)+cost[id]);
            }
            for(int i=0;i<cnt;i++) if(mask&(1<<i)) chmax(best[mask],best[mask^(1<<i)]+dp_closed[ch[a][i]]);
        }
        dp[a][0]=best[(1<<cnt)-1];
        for(int i=0;i<cnt;i++)
        {
            int to=ch[a][i];
            for(int j=1;j<=e;j++) chmax(dp[a][j],best[((1<<cnt)-1)^(1<<i)]+dp[to][j]);
        }
        for(int id:up_going[a]) chmax(dp[a][id],best[(1<<cnt)-1]);
        for(int i=0;i<=e;i++) chmax(dp_closed[a],dp[a][i]);
    };
    solve(1);
    cout << req+cost_sum-dp_closed[1] << "\n";
    return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 320 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 6 ms 4564 KB Output is correct
2 Correct 7 ms 4948 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 320 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 980 KB Output is correct
2 Correct 2 ms 1108 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 5 ms 3924 KB Output is correct
2 Correct 5 ms 3824 KB Output is correct
3 Correct 10 ms 3680 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 16 ms 14344 KB Output is correct
2 Correct 19 ms 13732 KB Output is correct
3 Correct 18 ms 15252 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 7 ms 3412 KB Output is correct
2 Correct 6 ms 3968 KB Output is correct
3 Correct 24 ms 16212 KB Output is correct
4 Correct 5 ms 3912 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 20 ms 16192 KB Output is correct
2 Correct 22 ms 16276 KB Output is correct
3 Correct 21 ms 16248 KB Output is correct
4 Correct 20 ms 15828 KB Output is correct