Submission #261983

# Submission time Handle Problem Language Result Execution time Memory
261983 2020-08-12T08:46:51 Z evpipis Islands (IOI08_islands) C++11
80 / 100
831 ms 131076 KB
#include <bits/stdc++.h>
using namespace std;

#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef pair<int, int> ii;

const int len = 1e6+5;
int deg[len], n, ccs;
ii par[len];
ll dep[len], best[len];
ll val[2*len], pref[2*len];
vector<int> order[len];
vector<ii> adj[len];

void dfs1(int u, int col){
    deg[u] = 1;
    order[col].pb(u);

    if (deg[par[u].fi] == 2)
        dfs1(par[u].fi, col);
}

void find_spec(){
    queue<int> myq;
    for (int i = 1; i <= n; i++){
        deg[i] = adj[i].size();
        if (deg[i] == 1)
            myq.push(i);
    }

    while (!myq.empty()){
        int u = myq.front(), p = par[u].fi;
        myq.pop();

        deg[p]--, deg[u]--;
        if (deg[p] == 1)
            myq.push(p);
    }

    ccs = 0;
    for (int i = 1; i <= n; i++)
        if (deg[i] == 2)
            dfs1(i, ccs++);

    /*printf("ccs = %d\n", ccs);
    for (int i = 0; i < ccs; i++){
        printf("cc#%d:", i);
        for (auto u: order[i])
            printf(" %d", u);
        printf("\n");
    }*/
}

ll dfs2(int u, int p = 0){
    ll mx1 = 0, mx2 = 0, ans = 0;

    for (auto v: adj[u]){
        if (v.fi == p || deg[v.fi])
            continue;

        ans = max(ans, dfs2(v.fi, u));
        dep[u] = max(dep[u], dep[v.fi]+v.se);

        if (dep[v.fi]+v.se > mx1)
            swap(mx1, mx2), mx1 = dep[v.fi]+v.se;
        else if (dep[v.fi]+v.se > mx2)
            mx2 = dep[v.fi]+v.se;
    }

    ans = max(ans, mx1+mx2);
    return ans;
}

void find_diam(){
    for (int i = 0; i < ccs; i++)
        for (auto u: order[i])
            best[i] = max(best[i], dfs2(u));

    //for (int i = 0; i < ccs; i++)
      //  printf("best_without_specs[%d] = %lld\n", i, best[i]);
}

deque<int> deq;

ll path(vector<int> &vec){
    ll ans = 0;

    int m = vec.size();
    for (int i = 0; i < 2*m; i++)
        val[i] = dep[vec[i%m]];
    for (int i = 0; i < 2*m-1; i++)
        pref[i+1] = pref[i]+par[vec[i%m]].se;

    deq.clear();
    for (int i = 0; i < 2*m; i++){
        while (!deq.empty() && i-deq.front()+1 > m)
            deq.pop_front();

        if (!deq.empty())
            ans = max(ans, pref[i]+val[i] + val[deq.front()]-pref[deq.front()]);

        while (!deq.empty() && val[i]-pref[i] >= val[deq.back()]-pref[deq.back()])
            deq.pop_back();
        deq.push_back(i);
    }

    return ans;
}

void find_path(){
    for (int i = 0; i < ccs; i++)
        best[i] = max(best[i], path(order[i]));

    //for (int i = 0; i < ccs; i++)
      //  printf("best_final[%d] = %lld\n", i, best[i]);
}

int main(){
    scanf("%d", &n);
    for (int i = 1; i <= n; i++){
        int p, c;
        scanf("%d %d", &p, &c);
        adj[i].pb(mp(p, c));
        adj[p].pb(mp(i, c));
        par[i] = mp(p, c);
    }

    find_spec();

    find_diam();

    find_path();

    ll ans = 0;
    for (int i = 0; i < ccs; i++)
        ans += best[i];
    printf("%lld\n", ans);
    return 0;
}

Compilation message

islands.cpp: In function 'int main()':
islands.cpp:123:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &n);
     ~~~~~^~~~~~~~~~
islands.cpp:126:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d", &p, &c);
         ~~~~~^~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 44 ms 47352 KB Output is correct
2 Correct 35 ms 47352 KB Output is correct
3 Correct 37 ms 47352 KB Output is correct
4 Correct 34 ms 47360 KB Output is correct
5 Correct 36 ms 47352 KB Output is correct
6 Correct 34 ms 47352 KB Output is correct
7 Correct 36 ms 47352 KB Output is correct
8 Correct 33 ms 47360 KB Output is correct
9 Correct 33 ms 47360 KB Output is correct
10 Correct 33 ms 47360 KB Output is correct
11 Correct 45 ms 47352 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 48 ms 47480 KB Output is correct
2 Correct 43 ms 47480 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 35 ms 47488 KB Output is correct
2 Correct 38 ms 47736 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 42 ms 48508 KB Output is correct
2 Correct 63 ms 50672 KB Output is correct
3 Correct 47 ms 48632 KB Output is correct
4 Correct 46 ms 47996 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 64 ms 51832 KB Output is correct
2 Correct 106 ms 54264 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 142 ms 60360 KB Output is correct
2 Correct 142 ms 63760 KB Output is correct
3 Correct 169 ms 72432 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 229 ms 70892 KB Output is correct
2 Correct 292 ms 89564 KB Output is correct
3 Correct 300 ms 93484 KB Output is correct
4 Correct 386 ms 111216 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 448 ms 102492 KB Output is correct
2 Runtime error 831 ms 131076 KB Execution killed with signal 9 (could be triggered by violating memory limits)
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 614 ms 131076 KB Execution killed with signal 9 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -