正题

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


题目大意

给出\(n\)个点的一张有向图。每个边\((u,v,w)\)表示\(u->v\)有一个类型\(w\)的左括号边,\(v->u\)有一个类型\(w\)的右括号边。

求图中有多少点对满足它们之间有一条合法的括号序列路径

\(1\leq n\leq 3\times 10^5,1\leq m\leq 6\times 10^5,1\leq k\leq n\)


解题思路

一个显然的结论是如果两个点之间有合法路径那么连一条边的话,那么最后出来的是一个团。

因为\(f(u,v)=1\Rightarrow f(v,u)=1\)(路径翻转),\(f(u,v)=f(v,z)=1\Rightarrow f(u,z)=1\)(路径拼接)。

考虑怎么求出这些团。假设我们现在有一个团\(x\),它连接向团外有两条类型一样的边,那么就代表我们可以把这两条边连接的节点(或者团)合并入这个团中。

然后合并的时候我们因为又要处理类型一样的边,所以我们用启发式合并枚举小的那个暴力丢进大的里面就好了。

时间复杂度\(O(n\log^2 n)\),用线段树合并可以做到\(O(n\log n)\)(也许?


code

#include<cstdio>
#include<cstring>
#include<queue>
#include<map>
#define mp(x,y) make_pair(x,y)
using namespace std;
const int N=3e5+10;
int n,m,k,fa[N],cnt[N];
long long ans;
queue<pair<int,int> >q;
map<int,int> G[N];
int find(int x)
{return (fa[x]==x)?x:(fa[x]=find(fa[x]));}
map<int,int>::iterator it;
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=m;i++){
int x,y,w;
scanf("%d%d%d",&x,&y,&w);
swap(x,y);
if(G[x][w])q.push(mp(G[x][w],y));
else G[x][w]=y;
}
for(int i=1;i<=n;i++)fa[i]=i;
while(!q.empty()){
int x=q.front().first,y=q.front().second;
x=find(x);y=find(y);q.pop();
if(x==y)continue;
if(G[x].size()<G[y].size())swap(x,y);
for(it=G[y].begin();it!=G[y].end();it++){
int w=it->first,z=it->second;
if(G[x][w])q.push(mp(G[x][w],z));
else G[x][w]=z;
}
fa[y]=x;
}
for(int i=1;i<=n;i++)cnt[find(i)]++;
for(int i=1;i<=n;i++)ans+=1ll*cnt[i]*(cnt[i]-1)/2ll;
printf("%lld\n",ans);
return 0;
}

P7323-[WC2021]括号路径【并查集,启发式合并】的更多相关文章

  1. [HDU 3712] Fiolki (带边权并查集+启发式合并)

    [HDU 3712] Fiolki (带边权并查集+启发式合并) 题面 化学家吉丽想要配置一种神奇的药水来拯救世界. 吉丽有n种不同的液体物质,和n个药瓶(均从1到n编号).初始时,第i个瓶内装着g[ ...

  2. [BZOJ 4668]冷战(带边权并查集+启发式合并)

    [BZOJ 4668]冷战(并查集+启发式合并) 题面 一开始有n个点,动态加边,同时查询u,v最早什么时候联通.强制在线 分析 用并查集维护连通性,每个点x还要另外记录tim[x],表示x什么时间与 ...

  3. BZOJ2733[HNOI2012]永无乡——线段树合并+并查集+启发式合并

    题目描述 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达 ...

  4. BZOJ 4668: 冷战 并查集启发式合并/LCT

    挺好想的,最简单的方法是并查集启发式合并,加暴力跳父亲. 然而,这个代码量比较小,比较好写,所以我写了 LCT,更具挑战性. #include <cstdio> #include < ...

  5. BZOJ 3673: 可持久化并查集(可持久化并查集+启发式合并)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3673 题意: 思路: 可持久化数组可以用可持久化线段树来实现,并查集的查询操作和原来的一般并查集操作 ...

  6. Codeforces 1166F 并查集 启发式合并

    题意:给你一张无向图,无向图中每条边有颜色.有两种操作,一种是询问从x到y是否有双彩虹路,一种是在x到y之间添加一条颜色为z的边.双彩虹路是指:如果给这条路径的点编号,那么第i个点和第i - 1个点相 ...

  7. 洛谷 P7323 - [WC2021] 括号路径(启发式合并)

    题面传送门 emmmm----怎么评价这个题嘛...感觉纯论算法,此题根本谈不上难题,不过 WC 时候太智障只拿了个 48pts 就走人了.总之,技不如人,甘拜吓疯( 首先要注意到几件事情: 如果 \ ...

  8. [bzoj3123][sdoi2013森林] (树上主席树+lca+并查集启发式合并+暴力重构森林)

    Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数 ...

  9. 2018.08.21 bzoj4668: 冷战(并查集+启发式合并)

    传送门 可以发现需要维护连通性和两点连通时间. 前者显然是并查集的常规操作,关键就在于如何维护两点的连通时间. 然后会想到这个时候不能用路径压缩了,因为它会破坏原本树形集合的结构,因此可以启发式按si ...

随机推荐

  1. 小程序iphone蒙层滚动穿透

    如图,这个弹出层在滚动列表的时候,在iPhone上是会穿透导致页面也跟着滚动,所以这时不能用普通的view标签加scroll属性实现,看了下文档发现有专门的scroll-view组件,用该组件替换就可 ...

  2. springCloud之路API路由网关Zuul

    1.简介 简单的理解就是,相当于在所有服务的调用前加了一层防火墙, 主要就是对外提供服务接口的时候,起到了请求的路由和过滤作用,也因此能够隐藏内部服务的接口细节,提高系统的安全性: 官方文档:http ...

  3. 服务器程序动态加载自定义jar包的过程

    需求: 用过hive的都知道,可以自定义hive的一个udf jar,然后将这个jar add到hive服务端,就会加载这个jar实现用户自定义逻辑.现在的需求就是实现这么一个服务端所做的事情! 场景 ...

  4. Git中使用.gitignore忽略文件的推送

    转载自:https://blog.csdn.net/lk142500/article/details/82869018 windows下可以用另存为生成gitignore 文件 1 简介 在使用Git ...

  5. 移动端touch事件——单指拖拽

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  6. 阿里云服务器安装配置nginx

    服务器: 阿里云 Alibaba Cloud Linux 下载 进入到预计存放nginx的目录,比如:/usr/local/ 下载nginx压缩包,并解压 cd /usr/local wget htt ...

  7. Windows下安装Apollo时的几个常见问题

    今天在本地安装Apollo时遇到几个问题,觉得还是记录下来,希望能给有需要的朋友提供帮助. 安装的过程参考这篇教程,https://www.jianshu.com/p/6cf4b15ba82f.流程基 ...

  8. jvm学习笔记:类加载过程

    类加载器子系统 类加载器的作用是加载class文件到内存 加载阶段->链接阶段->初始化阶段 ClassLoader只负责class文件的加载,至于是否能够运行由执行引擎判断 加载的类信息 ...

  9. TCP头部格式和封装

    文章目录 12.3 TCP头部和封装 12.3.1 端口号 12.3.2 序列号 12.3.3 头部长度 12.3.4 相关控制位 12.3.5 窗口大小 12.3.6 校验和 12.3.7 选项字段 ...

  10. python模块--calendar

    方法 返回值类型 说明 .calendar(theyear, w=2, l=1, c=6, m=3) str 返回指定年份的年历, w: 每个日期的宽度, l: 每一行的纵向宽度, c: 月与月之间的 ...