Submission #2921

#TimeUsernameProblemLanguageResultExecution timeMemory
2921tncks0121간선 파괴 (GA5_destroy)C++98
100 / 100
64 ms5416 KiB
#include <stdio.h>
#include <memory.h>
#include <algorithm>

using namespace std;

const int N_ = 1005;
const int M_ = 200005;

int N, M, Q;
short A[M_], B[M_];

short parent[N_];
short rank[N_];

void init() { for(int i = 1; i <= N; i++) parent[i] = i, rank[i] = 1; }

short get(short u) {
    int r = u;
    while(parent[r] != r) r = parent[r];
    while(u != r) {
        int p = parent[u];
        parent[u] = r;
        u = p;
    }
    return r;
}

bool merge (short a, short b) {
    a = get(a); b = get(b);
  if(rank[a] < rank[b]) {
    parent[a] = b;
  }else if(rank[a] > rank[b]) {
    parent[b] = a;
  }else {
    parent[b] = a;
    ++rank[a];
  }
    return a != b;
}

int F[N_], FN, R[N_], RN;
int EF[M_], ER[M_];
short T[N_][N_];

int main () {
    int i, j, k;

    scanf("%d%d", &N, &M);
    for(i = 1; i <= M; i++) scanf("%d%d", A+i, B+i);

    init();
    for(i = 1; i <= M; i++) if(merge(A[i], B[i])) F[++FN] = i;
    for(i = 1, j = 1; i <= M; i++) {
        EF[i] = j;
        if(F[j] == i) ++j;
    }
    
    init();
    for(i = M; i > 0; i--) if(merge(A[i], B[i])) R[++RN] = i;
    for(i = M, j = 1; i > 0; i--) {
        ER[i] = j;
        if(R[j] == i) ++j;
    }
    
    //for(i = 1; i <= M; i++) printf("%d ", F[EF[i]]); puts("");
    //for(i = 1; i <= FN; i++) printf("%d ", F[i]); puts("");puts("");
    //for(i = 1; i <= M; i++) printf("%d ", R[ER[i]]); puts("");
    //for(i = 1; i <= RN; i++) printf("%d ", R[i]); puts("");

    for(i = 1; i <= FN+1; i++) {
        int cnt = N;
        
        init();
        for(j = 1; j < i; j++) if(merge(A[F[j]], B[F[j]])) --cnt;
        
        for(j = 1; j <= RN; j++) {
            T[i][j] = cnt;
            if(merge(A[R[j]], B[R[j]])) --cnt;
            //printf("%d %d %d\n", F[i], R[j], cnt);
        }
        T[i][RN+1] = cnt;
    }

    scanf("%d", &Q);
    while(Q--) {
        int x, y, ret = N;
        scanf("%d%d", &x, &y);
        x = EF[x];
        y = ER[y];
        if(x > 0 && y > 0) ret = T[x][y];
        printf("%d\n", ret);
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...