답안 #588731

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
588731 2022-07-04T01:16:19 Z Bench0310 Islands (IOI08_islands) C++17
90 / 100
801 ms 131072 KB
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

const int N=1000001;
int u[N];
int vidx[N];
int ucost[N];
bool in_cycle[N];
ll dp[N];
ll down[N];
array<int,3> v[2*N];
int vsz=0;
array<int,3> bad_edges[N];
int badsz=0;
int cc[N];
int ccsz=0;
int cycle[N];
int cyclesz=0;

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n;
    cin >> n;
    for(int i=1;i<=n;i++) u[i]=i;
    function<int(int)> find_set=[&](int a)->int
    {
        if(a==u[a]) return a;
        else return u[a]=find_set(u[a]);
    };
    auto merge_sets=[&](int a,int b)->int
    {
        a=find_set(a);
        b=find_set(b);
        if(a==b) return 0;
        u[b]=a;
        return 1;
    };
    for(int a=1;a<=n;a++)
    {
        int b,c;
        cin >> b >> c;
        if(merge_sets(a,b))
        {
            v[vsz++]={a,b,c};
            v[vsz++]={b,a,c};
        }
        else bad_edges[badsz++]={a,b,c};
    }
    sort(v,v+vsz);
    for(int i=vsz-1;i>=0;i--) vidx[v[i][0]]=i;
    ll res=0;
    auto chmax=[&](ll &a,ll b){a=max(a,b);};
    memset(u,0,sizeof(u));
    for(int o=0;o<badsz;o++)
    {
        auto [x,y,bad_cost]=bad_edges[o];
        function<void(int)> dfs=[&](int a)
        {
            cc[ccsz++]=a;
            ll one=0,two=0;
            for(int i=vidx[a];i<vsz&&v[i][0]==a;i++)
            {
                auto [_,to,c]=v[i];
                if(to==u[a]) continue;
                u[to]=a;
                ucost[to]=c;
                dfs(to);
                ll len=c+down[to];
                if(len>one){two=one; one=len;}
                else if(len>two){two=len;}
                chmax(dp[a],dp[to]);
                chmax(down[a],len);
            }
            chmax(dp[a],one+two);
        };
        dfs(x);
        ll now=dp[x];
        int t=y;
        while(t!=0)
        {
            cycle[cyclesz++]=t;
            in_cycle[t]=1;
            t=u[t];
        }
        for(int i=0;i<ccsz;i++) down[cc[i]]=dp[cc[i]]=0;
        function<void(int,int)> go=[&](int a,int p)
        {
            for(int i=vidx[a];i<vsz&&v[i][0]==a;i++)
            {
                auto [_,to,c]=v[i];
                if(to==p||in_cycle[to]) continue;
                go(to,a);
                chmax(down[a],c+down[to]);
            }
        };
        for(int i=0;i<cyclesz;i++) go(cycle[i],0);
        ll path=0;
        for(int i=0;i<cyclesz;i++)
        {
            if(i>0) dp[cycle[i]]=dp[cycle[i-1]];
            chmax(dp[cycle[i]],path+down[cycle[i]]);
            path+=ucost[cycle[i]];
        }
        path=0;
        ll opt=0;
        for(int i=cyclesz-1;i>=0;i--)
        {
            path+=ucost[cycle[i]];
            chmax(opt,path+down[cycle[i]]);
            if(i>0) chmax(now,dp[cycle[i-1]]+bad_cost+opt);
        }
        res+=now;
        ccsz=cyclesz=0;
    }
    cout << res << "\n";
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 4180 KB Output is correct
2 Correct 2 ms 4308 KB Output is correct
3 Correct 2 ms 4308 KB Output is correct
4 Correct 2 ms 4180 KB Output is correct
5 Correct 2 ms 4180 KB Output is correct
6 Correct 2 ms 4180 KB Output is correct
7 Correct 2 ms 4180 KB Output is correct
8 Correct 2 ms 4180 KB Output is correct
9 Correct 2 ms 4228 KB Output is correct
10 Correct 2 ms 4308 KB Output is correct
11 Correct 2 ms 4308 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 4308 KB Output is correct
2 Correct 2 ms 4308 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 4308 KB Output is correct
2 Correct 3 ms 4692 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 5284 KB Output is correct
2 Correct 19 ms 7824 KB Output is correct
3 Correct 13 ms 5332 KB Output is correct
4 Correct 7 ms 4828 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 9068 KB Output is correct
2 Correct 42 ms 11068 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 77 ms 16928 KB Output is correct
2 Correct 78 ms 24184 KB Output is correct
3 Correct 123 ms 34180 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 150 ms 25320 KB Output is correct
2 Correct 166 ms 52916 KB Output is correct
3 Correct 188 ms 63552 KB Output is correct
4 Correct 236 ms 81444 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 407 ms 70756 KB Output is correct
2 Correct 633 ms 112356 KB Output is correct
3 Correct 253 ms 44356 KB Output is correct
4 Correct 339 ms 88152 KB Output is correct
5 Correct 355 ms 88864 KB Output is correct
6 Correct 801 ms 53196 KB Output is correct
7 Correct 371 ms 124060 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 305 ms 131072 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -