답안 #1036171

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1036171 2024-07-27T04:33:39 Z sleepntsheep Islands (IOI08_islands) C
100 / 100
392 ms 129360 KB
#include <stdio.h>

#define NN 1000001
#define MM 2000002

long long max(long long i, long long j) {return i > j ? i : j;} 

int n, ww[MM], to[MM], lnk[MM], head[NN], col[NN];

void link(int u, int v, int w) {
    static int ii = 0;
    int i = ++ii;
    to[i] = v;
    ww[i] = w;
    lnk[i] = head[u];
    head[u] = i;
}

int cycle_head, cycle_tail;
int cyc[NN], co, par[NN], incyc[NN];
long long tentacle[NN], tentacle2[NN], aa[NN], here;


int dfs(int u, int pe) {
    col[u] = 1;

    for (int j = head[u]; j; j = lnk[j]) if ((j + 1) / 2 - (pe + 1) / 2) {
        int v = to[j];
        if (col[v]) {
            cycle_head = u;
            cycle_tail = v;

            co = 0;
            int cur = u;
            for (; cur != v && cur != -1; cur = par[cur])
                incyc[cyc[co++] = cur] = 1;
            incyc[cyc[co++] = v] = 1;

            return 1;
        }
        par[v] = u;
        if (dfs(v, j))
            return 1;
    }
    return 0;
}

void dfs2(int u, int p) {
    col[u] = 1;
    for (int j = head[u]; j; j = lnk[j]) {
        int v = to[j];
        if (v == p || incyc[v]) continue;
        dfs2(v, u);

        if (tentacle[v] + ww[j] >= tentacle[u])
            tentacle2[u] = tentacle[u], tentacle[u] = tentacle[v] + ww[j];
        else if (tentacle[v] + ww[j] >= tentacle2[u])
            tentacle2[u] = tentacle[v] + ww[j];

    }
    here = max(here, tentacle[u]+ tentacle2[u]);
}

long long answer = 0;

int main() {
    scanf("%d", &n);
    for (int i = 1, j, k; i <= n; ++i)
        scanf("%d%d", &j, &k), link(i, j, k), link(j, i, k);

    for (int ii = 1; ii <= n; ++ii) {
        if (col[ii]) continue;

        par[ii] = -1;
        dfs(ii, -1);

        long long op0 = -1e18, op1 = -1e18;
        here = 0;

        long long cycle_w = 0;
        for (int i = 0; i < co; ++i) {
            for (int j = head[cyc[i]]; j; j = lnk[j])
                if (incyc[to[j]]) cycle_w += ww[j];
            dfs2(cyc[i], -1);
        }
        cycle_w /= 2;

        if (co == 2) {
            for (int j = head[cycle_head]; j; j = lnk[j])
                if (cycle_tail == to[j])
                    here = max(here, ww[j]+ tentacle[cycle_tail] + tentacle[cycle_head]);

            answer += here;
            continue;
        }

        for (int i = 0; i < co; ++i) {
            here = max(here, tentacle[cyc[i]] + max(aa[i] + op0, -aa[i] + op1));

            op0 = max(tentacle[cyc[i]] - aa[i], op0);
            op1 = max(tentacle[cyc[i]] + cycle_w + aa[i], op1);

            if (i + 1 < co)
                for (int j = head[cyc[i]]; j; j = lnk[j])
                    if (to[j] == cyc[i + 1]) {
                        aa[i + 1] = aa[i] + ww[j];
                        break;
                    }

        }

        answer += here;
    }
    printf("%lld\n", answer);
}

Compilation message

islands.c: In function 'main':
islands.c:67:5: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   67 |     scanf("%d", &n);
      |     ^~~~~~~~~~~~~~~
islands.c:69:9: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   69 |         scanf("%d%d", &j, &k), link(i, j, k), link(j, i, k);
      |         ^~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4444 KB Output is correct
2 Correct 1 ms 4444 KB Output is correct
3 Correct 1 ms 4444 KB Output is correct
4 Correct 1 ms 4444 KB Output is correct
5 Correct 0 ms 2396 KB Output is correct
6 Correct 1 ms 2396 KB Output is correct
7 Correct 1 ms 4444 KB Output is correct
8 Correct 1 ms 6492 KB Output is correct
9 Correct 0 ms 2396 KB Output is correct
10 Correct 0 ms 2396 KB Output is correct
11 Correct 1 ms 4444 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2392 KB Output is correct
2 Correct 1 ms 4440 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4444 KB Output is correct
2 Correct 1 ms 4700 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 5212 KB Output is correct
2 Correct 9 ms 5112 KB Output is correct
3 Correct 5 ms 3420 KB Output is correct
4 Correct 2 ms 2908 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 8028 KB Output is correct
2 Correct 15 ms 7916 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 31 ms 13660 KB Output is correct
2 Correct 36 ms 16084 KB Output is correct
3 Correct 48 ms 25432 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 77 ms 22228 KB Output is correct
2 Correct 89 ms 42836 KB Output is correct
3 Correct 102 ms 45652 KB Output is correct
4 Correct 134 ms 65620 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 143 ms 31556 KB Output is correct
2 Correct 293 ms 97684 KB Output is correct
3 Correct 128 ms 56144 KB Output is correct
4 Correct 212 ms 90012 KB Output is correct
5 Correct 169 ms 89520 KB Output is correct
6 Correct 392 ms 66440 KB Output is correct
7 Correct 194 ms 114096 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 229 ms 129360 KB Output is correct
2 Correct 212 ms 90196 KB Output is correct
3 Correct 201 ms 129200 KB Output is correct
4 Correct 156 ms 54356 KB Output is correct
5 Correct 172 ms 90192 KB Output is correct
6 Correct 158 ms 71952 KB Output is correct
7 Correct 352 ms 68732 KB Output is correct