제출 #2674

#제출 시각아이디문제언어결과실행 시간메모리
2674tncks0121간선 파괴 (GA5_destroy)C++98
100 / 100
1736 ms2660 KiB
#include <stdio.h> #include <memory.h> #include <algorithm> using namespace std; const int N_ = 1005; const int M_ = 200005; int N, M, Q; int A[M_], B[M_]; int parent[N_]; void init() { for(int i = 1; i <= N; i++) parent[i] = i; } int get(int 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 (int a, int b) { a = get(a); b = get(b); parent[a] = b; 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...