Submission #3169

#TimeUsernameProblemLanguageResultExecution timeMemory
3169myungwoo간선 파괴 (GA5_destroy)C++98
100 / 100
2176 ms3260 KiB
#include <stdio.h> #define MAXN 707 #define MAXM 123460 int N,M,Q; int mom[MAXN],prev[MAXM],next[MAXM]; bool fchk[MAXM],bchk[MAXM]; struct Edge{ Edge(int a=0,int b=0): a(a), b(b) {} int a,b; } edge[MAXM]; int _find(int n){ return mom[n]==n?n:(mom[n]=_find(mom[n])); } int _union(int a,int b){ a = _find(a), b = _find(b); if (a != b){ mom[b] = a; return 1; } return 0; } int main() { int i,k,s,e; scanf("%d%d",&N,&M); for (i=1;i<=M;i++) scanf("%d%d",&s,&e), edge[i] = Edge(s,e); for (i=1;i<=N;i++) mom[i] = i; for (i=1,k=0;i<=M;i++){ prev[i] = k; if (_union(edge[i].a,edge[i].b)){ fchk[i] = 1; k = i; } } for (i=1;i<=N;i++) mom[i] = i; for (i=M,k=M+1;i>0;i--){ next[i] = k; if (_union(edge[i].a,edge[i].b)){ bchk[i] = 1; k = i; } } for (scanf("%d",&Q);Q--;){ scanf("%d%d",&s,&e); for (i=1;i<=N;i++) mom[i] = i; for (--s;s>0;s=prev[s]) if (fchk[s]){ _union(edge[s].a,edge[s].b); } for (++e;e<=M;e=next[e]) if (bchk[e]){ _union(edge[e].a,edge[e].b); } int ans=0; for (i=1;i<=N;i++) if (_find(i) == i){ ans++; } printf("%d\n",ans); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...