제출 #406695

#제출 시각아이디문제언어결과실행 시간메모리
406695JoshcIslands (IOI08_islands)C++11
90 / 100
1177 ms131076 KiB
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
 
const int MAX_N = 1000001;

#define ll long long

int t[MAX_N], l[MAX_N], vis[MAX_N];
ll dist[MAX_N];
bool cycle[MAX_N];
vector<int> edges[MAX_N];
ll ans = 0;
vector<int> cur;

void dfs2(int x, int p, ll d) {
    cur.push_back(x);
    dist[x] = d;
    for (int i : edges[x]) {
        if (!cycle[i] && i != p) dfs2(i, x, d+(t[x]==i ? l[x] : l[i]));
    }
}

void dfs3(int x, int p, ll d) {
    dist[x] = d;
    for (int i : edges[x]) {
        if ((!cycle[x] || !cycle[i]) && i != p) dfs3(i, x, d+(t[x]==i ? l[x] : l[i]));
    }
}

void solve(vector<int> cyc) {
    ll best = 0, len = 0, psa = 0, x = -1e9, y = -1e9;
    for (int i : cyc) len += l[i];
    for (int i : cyc) {
        cur.clear();
        dfs2(i, i, 0);
        ll m = -1;
        int b;
        for (int j : cur) {
            if (dist[j] > m) {
                m = dist[j];
                b = j;
            }
        }
        best = max(best, max(psa+m+x, len+m-psa+y));
        x = max(x, m-psa);
        y = max(y, m+psa);
        psa += l[i];
        dfs3(b, b, 0);
        ll diameter = -1;
        for (int j : cur) diameter = max(diameter, dist[j]);
        best = max(best, diameter);
    }
    ans += best;
}

void dfs(int v, int c) {
    vis[v] = c;
    if (vis[t[v]] == c && !cycle[t[v]]) {
        vector<int> cyc = {v}, psa;
        for (int i=t[v]; i!=v; i=t[i]) cyc.push_back(i);
        for (int i : cyc) cycle[i] = true;
        solve(cyc);
    }
    if (vis[t[v]] == -1) dfs(t[v], c);
}

int main() {
    int n;
    scanf("%d", &n);
    for (int i=1; i<=n; i++) {
        scanf("%d%d", &t[i], &l[i]);
        cycle[i] = false;
        vis[i] = -1;
        edges[i].push_back(t[i]);
        edges[t[i]].push_back(i);
    }
    for (int i=1; i<=n; i++) {
        if (vis[i] == -1) dfs(i, i);
    }
    printf("%lld\n", ans);
}

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

islands.cpp: In function 'int main()':
islands.cpp:71:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   71 |     scanf("%d", &n);
      |     ~~~~~^~~~~~~~~~
islands.cpp:73:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   73 |         scanf("%d%d", &t[i], &l[i]);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~
islands.cpp: In function 'void solve(std::vector<int>)':
islands.cpp:50:13: warning: 'b' may be used uninitialized in this function [-Wmaybe-uninitialized]
   50 |         dfs3(b, b, 0);
      |         ~~~~^~~~~~~~~
#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...