Submission #2678

#TimeUsernameProblemLanguageResultExecution timeMemory
2678tncks0121간선 파괴 (GA5_destroy)C++98
100 / 100
1808 ms1880 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] = rank[i] = i; } 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 R[N_*2], RN; 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])) R[++RN] = i; init(); for(i = M; i > 0; i--) if(merge(A[i], B[i])) R[++RN] = i; scanf("%d", &Q); while(Q--) { int x, y, ret = 0; scanf("%d%d", &x, &y); init(); for(i = 1; i <= RN; i++) { if(R[i] < x || y < R[i]) merge(A[R[i]], B[R[i]]); } for(i = 1; i <= N; i++) if(get(i) == i) ++ret; printf("%d\n", ret); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...