分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 软件开发

[JSOI2008]星球大战starwar BZOJ1015

发布时间:2023-09-06 01:53责任编辑:彭小芳关键词:暂无标签

并查集

正序处理时间复杂度为n^2,考虑逆序处理,这样,时间复杂度从n^2降为nlogn

附上代码:

#include <cstdio>#include <algorithm>#include <cmath>#include <cstring>#include <cstdlib>#include <iostream>#include <queue>using namespace std;#define N 400005int fa[N<<1],n,m,K,head[N<<1],cnt,q[N],ans[N];struct node{int to,next;}e[N<<1];void add(int x,int y){e[cnt].to=y;e[cnt].next=head[x];head[x]=cnt++;return ;}int find(int x){int p=x,t;while(fa[p]!=p)p=fa[p];while(x!=p)t=fa[x],fa[x]=p,x=t;return p;}bool vis[N];int main(){for(int i=1;i<N;i++)fa[i]=i;memset(head,-1,sizeof(head));memset(vis,1,sizeof(vis));scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);x++,y++;add(x,y);add(y,x);}scanf("%d",&K);ans[K]=n-K;for(int i=1;i<=K;i++){scanf("%d",&q[i]);q[i]++;vis[q[i]]=0;}for(int i=1;i<=n;i++){if(!vis[i])continue;for(int j=head[i];j!=-1;j=e[j].next){int to1=e[j].to;if(!vis[to1])continue;int fx=find(i),fy=find(to1);if(fx!=fy){fa[fx]=fy;ans[K]--;}}}vis[q[K]]=1;for(int i=K-1;i>=0;i--){ans[i]=ans[i+1]+1;for(int j=head[q[i+1]];j!=-1;j=e[j].next){int to1=e[j].to;if(!vis[to1])continue;int fx=find(q[i+1]),fy=find(to1);if(fx!=fy){fa[fx]=fy;ans[i]--;}}vis[q[i]]=1;}for(int i=0;i<=K;i++){printf("%d\n",ans[i]);}return 0;}

  

[JSOI2008]星球大战starwar BZOJ1015

原文地址:https://www.cnblogs.com/Winniechen/p/9005135.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved