답안 #3343

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
3343 2013-08-30T12:57:35 Z wookayin 두 섬간의 연결 (kriii1_2) C++
0 / 1
40 ms 1992 KB
#include <cstdio>
#include <map>

using namespace std;

int n;
int uf[100001];
int sz[100001];

int find(int x) {
        if(uf[x] == x) return x;
        else return uf[x] = find(uf[x]);
}

struct info {
        int m1, m2;
        int p;
};

info merge(int i, int j) {
        i = find(i), j = find(j);
        info ret;

        ret.m1 = sz[i];
        ret.m2 = sz[j];

        // uf[i] = j
        uf[i] = j;
        sz[j] += sz[i];
        sz[i] = 0;

        ret.p = sz[j];
        return ret;
}

int nextInt() {
        int t; scanf("%d", &t); return t;
}

struct P {
        long long first;
        long long second;
        P(long long first, long long second) : first(first), second(second) {}
};

long long go(long long k, int w) {
        return k*(k-1)/2*w;
}
long long go2(long long k, int w) {
        return k*(k-1)*(k+1)/6*w;
}

int main() {
        n = nextInt();

        map<int, int> a;
        a[1] = n;

        for(int i = 0; i < n; ++ i)
                uf[i] = i, sz[i] = 1;

        long long ans1 = go(1LL, n);
        long long ans2 = go2(1LL, n);

        for(int i = 0; i < n - 1; ++ i) {
                int p = nextInt() - 1;
                info in = merge(p, p+1);

                ans1 = ans1 - go(in.m1, a[in.m1]);
                ans1 = ans1 - go(in.m2, a[in.m2]);
                ans2 = ans2 - go2(in.m1, a[in.m1]);
                ans2 = ans2 - go2(in.m2, a[in.m2]);

                a[in.m1] --;
                a[in.m2] --;
                a[in.p] ++;
                ans1 = ans1 + go(in.p, a[in.p]);
                ans2 = ans2 + go2(in.p, a[in.p]);

                printf("%lld %lld\n", ans1, ans2);
        }

        return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 40 ms 1992 KB Output isn't correct
2 Halted 0 ms 0 KB -