CF1444C Team-Building(可持久化并查集)(二分图)
解析
容易想到补集思想,寻找那些组之间不能形成二分图
二分图一般的两个判定方法:
- 染色
- 并查集
这里考虑并查集(看题解似乎染色也可做)
先把所有组内的边合并并查集
如果某个组自己内部就有奇环,显然不能和任何点配对,直接删去并减去其贡献
对于其他的边,注意到,由于总边数只有5e5级别,所以图会非常稀疏
可以使用一些暴力点思路
我们sort一下,对于每个集合对(u,v),把其对应的边全部加上,判断完毕之后,再把边删去
由于并查集需要撤销,不路径压缩,只按秩合并
代码
#include<bits/stdc++.h>
const int N=2e6+100;
const int mod=1e9+7;
#define ll long long
using namespace std;
inline ll read() {ll x(0),f(1);char c=getchar();while(!isdigit(c)) {if(c=='-')f=-1;c=getchar();}while(isdigit(c)) {x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}int n,m,k;ll ans;
int vis[N],col[N];#define oth(u) (u>n?u-n:u+n)
int fa[N],siz[N],dis[N],top,u[N],v[N],ori;
int find(int x){return x==fa[x]?x:find(fa[x]);}
inline void merge(int x,int y){x=find(x);y=find(y);if(x==y) return;if(siz[x]>siz[y]) swap(x,y);fa[x]=y;siz[y]+=siz[x];++top;u[top]=x;v[top]=y;return;
}struct edge{int x,y;
}e[N];
int num;
bool cmp(edge a,edge b){if(col[a.x]!=col[b.x]) return col[a.x]<col[b.x];else return col[a.y]<col[b.y];
}int main(){#ifndef ONLINE_JUDGE//freopen("a.in","r",stdin);//freopen("a.out","w",stdout);#endifn=read();m=read();k=read();ans=1ll*k*(k-1)/2;for(int i=1;i<=n*2;i++) fa[i]=i,siz[i]=1;for(int i=1;i<=n;i++) col[i]=read();for(int i=1;i<=m;i++){int x=read(),y=read();if(col[x]==col[y]){if(find(x)==find(y)){if(!vis[col[x]]) ans-=--k;vis[col[x]]=1;}else{merge(x,oth(y));merge(y,oth(x));}}else{if(col[x]>col[y]) swap(x,y);e[++num]=(edge){x,y};}}ori=top;sort(e+1,e+1+num,cmp);for(int i=1;i<=num;){int x=e[i].x,y=e[i].y,a=col[x],b=col[y],flag=0;if(vis[a]||vis[b]){++i;continue;}if(find(x)==find(y)){flag=1;}else{merge(x,oth(y));merge(y,oth(x));}i++;while(i<=num&&col[e[i].x]==a&&col[e[i].y]==b){x=e[i].x,y=e[i].y;if(find(x)==find(y)){flag=1;}else{merge(x,oth(y));merge(y,oth(x));}i++;}while(top!=ori){int x=u[top],y=v[top];top--;fa[x]=x;siz[y]-=siz[x];}ans-=flag;}printf("%lld\n",ans);
}
CF1444C Team-Building(可持久化并查集)(二分图)相关推荐
- 【9.22校内测试】【可持久化并查集(主席树实现)】【DP】【点双联通分量/割点】...
1 build 1.1 Description 从前有一个王国,里面有n 座城市,一开始两两不连通.现在国王将进行m 次命令,命令可 能有两种,一种是在u 和v 之间修建道路,另一种是询问在第u 次命 ...
- BZOJ5415:[NOI2018]归程(可持久化并查集,最短路)
Description Input Output Sample Input1 1 4 3 1 2 50 1 2 3 100 2 3 4 50 1 5 0 2 3 0 2 1 4 1 3 1 3 2 S ...
- BZOJ 3673: 可持久化并查集 by zky
Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 0& ...
- 洛谷P4768 [NOI2018]归程 [可持久化并查集,Dijkstra]
题目传送门 归程 格式难调,题面就不放了. 分析: 之前同步赛的时候反正就一脸懵逼,然后场场暴力大战,现在呢,还是不会$Kruskal$重构树,于是就拿可持久化并查集做. 但是之前做可持久化并查集的时 ...
- bzoj 36733674 可持久化并查集加强版(可持久化线段树+启发式合并)
CCZ在2015年8月25日也就是初三暑假要结束的时候就已经能切这种题了%%% 学习了另一种启发式合并的方法,按秩合并,也就是按树的深度合并,实际上是和按树的大小一个道理,但是感觉(至少在这题上)更好 ...
- 可持久化4--可持久化并查集
可持久化并查集 可持久化并查集 = 按秩合并并查集 + 可持久化数组 首先并查集不能采用路径压缩,这是因为一次findR操作中,fa数组的很多位置(u->ru)会发生修改,由于每次修改都需要在可 ...
- 可持久化线段树【主席树】可持久化并查集【主席树+并查集】
笼统的主席树原理 众所周知, 主席树是可以持久化的, 换言之你能知道你所维护信息的所有历史状态. 主席树是这样做的: 1. 首先建一颗朴素的线段树,代表初始状态 (下图黑色) , 也就是第0次操作后的 ...
- [NOI2018] 归程 可持久化并查集
题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个n 个节点.m 条边的无向连通图(节点的编号从 1至 n).我们依次用 l,a描述一条边的长度.海拔. ...
- Claris’ Contest # 2 Day 2 Problem C. Dash Speed(分治+可持久化并查集+树剖)
题面 题解 \(std\)爆栈了→_→ 我们先考虑一个简化的问题,如果只有加边的情况下如何动态维护直径 合并两棵树时,设\(a,b\)为\(A\)的直径的两个端点,\(c,d\)为\(B\)的直径的两 ...
最新文章
- Mac OS X安装Git
- 设计模式学习(五) 适配器模式
- C#(Net)软件开发常用工具汇总,提高你的开发效率
- 未将对象引用设置到对象的实例
- 基于Windows Server 2003 ntbackup下数据文件的完整备份与差异备份
- 【前端】网页布局基础
- 有关系统环境变量的设置问题
- 针对数据科学家和数据工程师的4条SQL技巧
- 移植wpa_supplicant软件与DHCP软件解密WPA/WPA2 加密的无线网络
- 串的定长存储表示【数据结构】
- 记录TCP协议使用Socket连接,客户端请求服务器read()阻塞问题
- DNS和VIP的区别
- 六款Mac电脑上值得推荐的看图工具,欢迎收藏!
- 毒液组学-多组学关联分析大全
- 网页磁贴模板_文本磁贴(登录)模板 (HTML)
- 攻防世界misc 如来十三掌
- 技术内幕 | StarRocks Pipeline 执行框架(下)
- 抖音CEO张一鸣:大学四年收获及工作感悟
- 淘宝如何打造承载亿级流量的首页?
- Opencv配置常见问题:
热门文章
- 无法定位程序输入点dxgiget_美国ABB TZIDC 智能定位器调试方法
- oracle挂证多少钱一个月_惊呆,一条sql竟然把Oracle搞挂了
- Java交流|面试最后一问:你有什么问题想问我吗?
- python打包成安装包_把 python 程序打包成 egg 或者 whl 安装包
- hotelling t2 matlab,pca主成份分析方法
- 东北大学计算机 大一物理考试题,东北大学大学物理期末考题及答案Word版
- 共聚焦图片怎么加标尺_聚焦扶贫政策,打造小康生活
- 后端学习 - Spring5
- 高等数学上-赵立军-北京大学出版社-题解-练习2.4
- Oulipo HDU - 1686(哈希或KMP)匹配字符串