正题

题目链接:https://www.luogu.com.cn/problem/CF1444C


题目大意

给出nnn个点mmm条边的一张图,总共kkk个颜色,每个点有一个颜色。

询问有多少无序颜色对(x,y)(x,y)(x,y)满足x≠yx\neq yx​=y且颜色为xxx或yyy的点构成的生成子图是一个二分图。

1≤n,m,k≤5×1051\leq n,m,k\leq 5\times 10^51≤n,m,k≤5×105


解题思路

首先把单独颜色就有奇环的颜色给去掉。

然后会发现实际上我们不需要对于k×(k−1)2\frac{k\times (k-1)}{2}2k×(k−1)​种情况都判断,因为只有mmm条边,我们只需要边连接的不同颜色判断即可,这样的次数是O(m)O(m)O(m)级别的。

然后先连好同色的,用个可撤销+扩展域的并查集每种颜色对暴力判断即可。

时间复杂度:O(mlog⁡n)O(m\log n)O(mlogn)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#define mp(x,y) make_pair(x,y)
using namespace std;
const int N=1e6+10;
struct edge{int x,y;pair<int,int> w;
}e[N];
struct cld{int x,y,fa,dep;
}cl[N];
int n,m,k,clt;bool flag,ban[N];
int c[N],ls[N],dep[N],fa[N];
bool cmp(edge x,edge y)
{return x.w<y.w;}
int find(int x)
{return (fa[x]==x)?x:find(fa[x]);}
void unionn(int x,int y){x=find(x);y=find(y);if(x==y)return;if(dep[x]<dep[y])swap(x,y);cl[++clt]=(cld){x,y,fa[y],dep[x]};fa[y]=x;dep[x]=max(dep[x],dep[y]+1);
}
void remake(){while(clt){fa[cl[clt].y]=cl[clt].fa;dep[cl[clt].x]=cl[clt].dep;clt--;}return;
}
int main()
{scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=2*n;i++)fa[i]=i,dep[i]=1;for(int i=1;i<=n;i++)scanf("%d",&c[i]);for(int i=1;i<=m;i++){scanf("%d%d",&e[i].x,&e[i].y);if(c[e[i].x]==c[e[i].y]){unionn(e[i].x,e[i].y+n);unionn(e[i].x+n,e[i].y);if(find(e[i].x)==find(e[i].y))k-=!ban[c[e[i].x]],ban[c[e[i].x]]=1;}e[i].w=mp(c[e[i].x],c[e[i].y]);if(e[i].w.first>e[i].w.second)swap(e[i].w.first,e[i].w.second);}sort(e+1,e+1+m,cmp);long long ans=1ll*k*(k-1)/2;for(int l=1,r=1;l<=m;l=r+1){while(e[r+1].w==e[l].w)r++;if(ban[e[l].w.first]||ban[e[l].w.second]||e[l].w.first==e[l].w.second)continue;clt=0;flag=0;for(int i=l;i<=r;i++){int x=e[i].x,y=e[i].y;if(find(x)==find(y)){flag=1;break;}unionn(x,y+n);unionn(x+n,y);}remake();ans-=flag;}printf("%lld\n",ans);return 0;
}

CF1444C-Team-Building【可撤销并查集】相关推荐

  1. 线段树分治 ---- F. Extending Set of Points(线段树分治 + 可撤销并查集)

    题目链接 题目大意: 你有个点集合SSS,每次往集合里面加点或者删点(如果要加的点出现过),如果(x1,y1),(x2,y1),(x1,y2),(x2,y2)(x1,y1),(x2,y1),(x1,y ...

  2. 线段树分治 ---- CF1217F - Forced Online Queries Problem(假离线 可撤销并查集 + 线段树分治)详解

    题目链接 题目大意 解题思路: 我一开始想到可以用可撤销并查集去维护这种删边加边的操作,但是有个缺点是每次撤销都有把后面的边全部撤销复度是O(n2)O(n^2)O(n2) 首先我们考虑这种动态加边删边 ...

  3. 洛谷P7518:宝石(倍增、可撤销并查集)

    解析 算法一 定义 upx,kup_{x,k}upx,k​ 为节点 xxx 从自己的颜色所在位置在返祖链上往后跳 2k2^k2k 个颜色到达的节点. 可以像倍增一样的求解. 这样对于一次询问 (s,t ...

  4. CF603E-Pastoral Oddities【CDQ分治,可撤销并查集】

    正题 题目链接:https://www.luogu.com.cn/problem/CF603E 题目大意 开始时有nnn个点,没有边. 依次加入mmm条带权的边,每次加入后询问是否存在一个边集,满足每 ...

  5. BZOJ4358: permu(带撤销并查集 不删除莫队)

    题意 题目链接 Sol 感觉自己已经老的爬不动了.. 想了一会儿,大概用个不删除莫队+带撤销并查集就能搞了吧,\(n \sqrt{n} logn\)应该卡的过去 不过不删除莫队咋写来着?....跑去学 ...

  6. codeforces 892E(离散化+可撤销并查集)

    题意 给出一个n个点m条边的无向联通图(n,m<=5e5),有q(q<=5e5)个询问 每个询问询问一个边集{Ei},回答这些边能否在同一个最小生成树中 分析 要知道一个性质,就是权值不同 ...

  7. 【BZOJ4025】二分图(可撤销并查集+线段树分治)

    题目: BZOJ4025 分析: 定理:一个图是二分图的充要条件是不存在奇环. 先考虑一个弱化的问题:保证所有边出现的时间段不会交叉,只会包含或相离. 还是不会?再考虑一个更弱化的问题:边只会出现不会 ...

  8. 【Codeforces576E_CF576E】Painting Edges(可撤销并查集+线段树分治)

    题目 CF576E 分析: 从前天早上肝到明天早上qwq其实颓了一上午MC ,自己瞎yy然后1A,写篇博客庆祝一下. 首先做这题之前推荐一道很相似的题:[BZOJ4025]二分图(可撤销并查集+线段树 ...

  9. 图论 + 并查集 ----最小生成树重构图 + 可撤销并查集 + set启发式合并 时间线上的离线求解 D. Graph and Queries

    解题思路 题目大意: 就是给你一个无向图,每个点都有一个权值,和qqq次询问 每次询问有两种操作 1 x:就询问从x点出发,能访问到的最大权值是多少,并把最大权值那个点的权值设置为0 2 x:就是删除 ...

最新文章

  1. python使用imbalanced-learn的NearMiss方法进行下采样处理数据不平衡问题
  2. 天天用Synchronized,底层原理是个啥?
  3. Arrays(Chapter 6 of JavaScript: The Good Parts)
  4. boost::safe_numerics::checked_result相关的测试程序
  5. 一个类GraphQL的ORM数据访问框架发布
  6. 机器学习实战(6):SVM-SMO-核函数 手写识别
  7. Huffman编码解码
  8. 求出千位数上的数加百位数上的数等于十位数上的数加个位数上的数的个数cnt,再把所有满足条件的四位数依次存入数组b中,然后对数组b中的四位数按从大到小的顺序进行排序。
  9. PostGreSQL(1)-源码安装
  10. mysql 搭建日志服务器_rsyslog+mysql+loganalyzer 环境搭建日志服务器
  11. 《Python自动化》学习笔记:百度云智能进行文字识别(代码干货)
  12. go - struct
  13. 将java类的泛型集合转换成json对象
  14. Opencv中convertTo函数
  15. stellarium-0.19.3.1-win64.exe下载
  16. 从零开始 了解C++
  17. 据消息称小米显示器34寸带鱼屏即将暂停销售:因为三星屏幕停止供应。
  18. 苹果自带相册打马赛克_剪映app怎么给视频局部打马赛克
  19. vbs在excel中打开html文件,从命令行使用VBScript从Excel外部运行Excel宏
  20. 生活简单案例,分析管理中的深奥道理

热门文章

  1. html 输入框自动缩短 一行内显示,JQuery UI组合框自动补全功能改进版(即时全部显示+input内容保存)...
  2. java jdk win10安装_Java 安装 JDK WIN10
  3. python中getrandbits函数用法_python random - 刘江的python教程
  4. python设置字符间距_python字符串处理以及字符串格式化
  5. future.cancel不能关闭线程_多线程与高并发笔记
  6. cheatengine找不到数值_彩票中奖500万,领了还不到一半?这些问题不解决,钱都拿不走...
  7. 后端学习 - 计算机网络
  8. leetcode27:移除元素(暴力+双指针)
  9. 黑鲨会升级鸿蒙吗,买华为别乱选!这3款才是“最佳选择”,未来能升级鸿蒙系统...
  10. C++实现五子棋小游戏