解析

容易想到补集思想,寻找那些组之间不能形成二分图

二分图一般的两个判定方法:

  1. 染色
  2. 并查集

这里考虑并查集(看题解似乎染色也可做)
先把所有组内的边合并并查集
如果某个组自己内部就有奇环,显然不能和任何点配对,直接删去并减去其贡献
对于其他的边,注意到,由于总边数只有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(可持久化并查集)(二分图)相关推荐

  1. 【9.22校内测试】【可持久化并查集(主席树实现)】【DP】【点双联通分量/割点】...

    1 build 1.1 Description 从前有一个王国,里面有n 座城市,一开始两两不连通.现在国王将进行m 次命令,命令可 能有两种,一种是在u 和v 之间修建道路,另一种是询问在第u 次命 ...

  2. 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 ...

  3. BZOJ 3673: 可持久化并查集 by zky

    Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 0& ...

  4. 洛谷P4768 [NOI2018]归程 [可持久化并查集,Dijkstra]

    题目传送门 归程 格式难调,题面就不放了. 分析: 之前同步赛的时候反正就一脸懵逼,然后场场暴力大战,现在呢,还是不会$Kruskal$重构树,于是就拿可持久化并查集做. 但是之前做可持久化并查集的时 ...

  5. bzoj 36733674 可持久化并查集加强版(可持久化线段树+启发式合并)

    CCZ在2015年8月25日也就是初三暑假要结束的时候就已经能切这种题了%%% 学习了另一种启发式合并的方法,按秩合并,也就是按树的深度合并,实际上是和按树的大小一个道理,但是感觉(至少在这题上)更好 ...

  6. 可持久化4--可持久化并查集

    可持久化并查集 可持久化并查集 = 按秩合并并查集 + 可持久化数组 首先并查集不能采用路径压缩,这是因为一次findR操作中,fa数组的很多位置(u->ru)会发生修改,由于每次修改都需要在可 ...

  7. 可持久化线段树【主席树】可持久化并查集【主席树+并查集】

    笼统的主席树原理 众所周知, 主席树是可以持久化的, 换言之你能知道你所维护信息的所有历史状态. 主席树是这样做的: 1. 首先建一颗朴素的线段树,代表初始状态 (下图黑色) , 也就是第0次操作后的 ...

  8. [NOI2018] 归程 可持久化并查集

    题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个n 个节点.m 条边的无向连通图(节点的编号从 1至 n).我们依次用 l,a描述一条边的长度.海拔. ...

  9. Claris’ Contest # 2 Day 2 Problem C. Dash Speed(分治+可持久化并查集+树剖)

    题面 题解 \(std\)爆栈了→_→ 我们先考虑一个简化的问题,如果只有加边的情况下如何动态维护直径 合并两棵树时,设\(a,b\)为\(A\)的直径的两个端点,\(c,d\)为\(B\)的直径的两 ...

最新文章

  1. Mac OS X安装Git
  2. 设计模式学习(五) 适配器模式
  3. C#(Net)软件开发常用工具汇总,提高你的开发效率
  4. 未将对象引用设置到对象的实例
  5. 基于Windows Server 2003 ntbackup下数据文件的完整备份与差异备份
  6. 【前端】网页布局基础
  7. 有关系统环境变量的设置问题
  8. 针对数据科学家和数据工程师的4条SQL技巧
  9. 移植wpa_supplicant软件与DHCP软件解密WPA/WPA2 加密的无线网络
  10. 串的定长存储表示【数据结构】
  11. 记录TCP协议使用Socket连接,客户端请求服务器read()阻塞问题
  12. DNS和VIP的区别
  13. 六款Mac电脑上值得推荐的看图工具,欢迎收藏!
  14. 毒液组学-多组学关联分析大全
  15. 网页磁贴模板_文本磁贴(登录)模板 (HTML)
  16. 攻防世界misc 如来十三掌
  17. 技术内幕 | StarRocks Pipeline 执行框架(下)
  18. 抖音CEO张一鸣:大学四年收获及工作感悟
  19. 淘宝如何打造承载亿级流量的首页?
  20. Opencv配置常见问题:

热门文章

  1. 无法定位程序输入点dxgiget_美国ABB TZIDC 智能定位器调试方法
  2. oracle挂证多少钱一个月_惊呆,一条sql竟然把Oracle搞挂了
  3. Java交流|面试最后一问:你有什么问题想问我吗?
  4. python打包成安装包_把 python 程序打包成 egg 或者 whl 安装包
  5. hotelling t2 matlab,pca主成份分析方法
  6. 东北大学计算机 大一物理考试题,东北大学大学物理期末考题及答案Word版
  7. 共聚焦图片怎么加标尺_聚焦扶贫政策,打造小康生活
  8. 后端学习 - Spring5
  9. 高等数学上-赵立军-北京大学出版社-题解-练习2.4
  10. Oulipo HDU - 1686(哈希或KMP)匹配字符串