제출 #262230

#제출 시각아이디문제언어결과실행 시간메모리
262230evpipisIslands (IOI08_islands)C++11
90 / 100
1064 ms131076 KiB
#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){
    while (deg[u] == 2){
        deg[u] = 1;
        order[col].pb(u);

        u = par[u].fi;
    }
}

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++);
}

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;
}

/*ll dfs2(int st){
    vector<int> vec;
    stack<int> mys;
    mys.push(st);
    while (!mys.empty()){
        int u = mys.top();
        mys.pop();

        vec.pb(u);

        for (auto v: adj[u])
            if (v.fi != par[u].fi && !deg[v.fi])
                mys.push(v.fi);
    }

    ll ans = 0;
    reverse(vec.begin(), vec.end());
    for (auto u: vec){
        ll mx1 = 0, mx2 = 0;

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

            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));
}

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;

    deque<int> deq;
    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]));
}

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;
}

컴파일 시 표준 에러 (stderr) 메시지

islands.cpp: In function 'int main()':
islands.cpp:146:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  146 |     scanf("%d", &n);
      |     ~~~~~^~~~~~~~~~
islands.cpp:149:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  149 |         scanf("%d %d", &p, &c);
      |         ~~~~~^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...