Submission #7760

#TimeUsernameProblemLanguageResultExecution timeMemory
7760tncks0121간선 파괴 (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 <= 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; } 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...