제출 #2689

#제출 시각아이디문제언어결과실행 시간메모리
2689gs13068간선 파괴 (GA5_destroy)C++98
60 / 100
1324 ms6004 KiB
#include<cstdio> #include<vector> #define BUCKET_SIZE 8 int s[123456]; int e[123456]; struct edge { int s; int e; } temp; std::vector<edge> pre[482]; std::vector<edge> suf[482]; int parent[700]; int height[700]; inline int root(int x) { return parent[x]==x?x:parent[x]=root(parent[x]); } inline void combine(int a,int b) { a=root(a); b=root(b); if(a==b)return; if(height[a]<height[b])parent[a]=b; else parent[b]=a; if(height[a]==height[b])height[b]++; } int main() { int i,j,k,n,m,l,r,q; scanf("%d%d",&n,&m); for(i=0;i<m;i++) { scanf("%d%d",&s[i],&e[i]); s[i]--;e[i]--; } for(i=0;i<n;i++) { parent[i]=i; height[i]=0; } for(i=0;i<m;i++) { combine(s[i],e[i]); if((i&((1<<BUCKET_SIZE)-1))==(1<<BUCKET_SIZE)-1) { for(j=0;j<n;j++)if(parent[j]!=j) { temp.s=j; temp.e=parent[j]; pre[i>>BUCKET_SIZE].push_back(temp); } } } for(i=0;i<n;i++) { parent[i]=i; height[i]=0; } for(i=m-1;i>=0;i--) { combine(s[i],e[i]); if(!(i&((1<<BUCKET_SIZE)-1))) { for(j=0;j<n;j++)if(parent[j]!=j) { temp.s=j; temp.e=parent[j]; suf[i>>BUCKET_SIZE].push_back(temp); } } } scanf("%d",&q); for(i=0;i<q;i++) { scanf("%d%d",&l,&r); l--;r--; for(j=0;j<n;j++) { parent[j]=j; height[j]=0; } j=(l>>BUCKET_SIZE)-1; if(j>=0)for(k=0;k<pre[j].size();k++)combine(pre[j][k].s,pre[j][k].e); for(k=(l>>BUCKET_SIZE)<<BUCKET_SIZE;k<l;k++)combine(s[k],e[k]); j=(r>>BUCKET_SIZE)+1; for(k=0;k<suf[j].size();k++)combine(suf[j][k].s,suf[j][k].e); for(k=r+1;k<((r>>BUCKET_SIZE)+1)<<BUCKET_SIZE;k++)if(k<m)combine(s[k],e[k]); k=0; for(j=0;j<n;j++)if(parent[j]==j)k++; printf("%d\n",k); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...