题意

给一棵nnn个节点的树,有q" role="presentation" style="position: relative;">qqq次操作,每次操作会加入一条边,可能会形成环。每次操作后输出有多少个三元组(u,v,w)(u,v,w)(u,v,w)满足其两两不同且存在一条uuu到w" role="presentation" style="position: relative;">www的路径和一条vvv到w" role="presentation" style="position: relative;">www的路径满足两条路径之间没有公共边。
n,q≤105n,q≤105n,q\le10^5

分析

如果只是一棵树的话,可以通过枚举中间点www来计数。
如果是一个图的话,若u,v,w" role="presentation" style="position: relative;">u,v,wu,v,wu,v,w存在于同一个边双中,则三元组(u,v,w)(u,v,w)(u,v,w)必然满足条件。
对于不在同一个边双中的合法三元组,分两种情况,一种是中间点和一个端点在同一个边双中,这时另一个端点可以随便取;一种是三个点都不在同一个边双中,这样的话就跟一般的树是一样的。
只要维护每个点作为中间点的贡献,每次加边后把路径上的点缩到一起,同时维护答案即可。

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>typedef long long LL;const int N=100005;int n,size[N],dep[N],fa[N],cnt,last[N],s[N],f[N];
struct edge{int to,next;}e[N*2];
LL ans,val[N];int read()
{int x=0,f=1;char ch=getchar();while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}int find(int x)
{if (f[x]==x) return x;else return f[x]=find(f[x]);
}void addedge(int u,int v)
{e[++cnt].to=v;e[cnt].next=last[u];last[u]=cnt;e[++cnt].to=u;e[cnt].next=last[v];last[v]=cnt;
}void dfs(int x)
{dep[x]=dep[fa[x]]+1;size[x]=1;for (int i=last[x];i;i=e[i].next){if (e[i].to==fa[x]) continue;fa[e[i].to]=x;dfs(e[i].to);size[x]+=size[e[i].to];val[x]+=(LL)size[e[i].to]*size[e[i].to];}val[x]+=(LL)(n-size[x])*(n-size[x]);ans-=val[x];
}LL get(int s)
{return (LL)s*(s-1)*(s-2);
}void merge(int x,int y)
{ans-=(LL)(n-s[x])*(n-s[x])*s[x]+(LL)(n-s[y])*(n-s[y])*s[y]-val[x]*s[x]-val[y]*s[y]+get(s[x])+get(s[y])+(LL)s[x]*(s[x]-1)*(n-s[x])*2+(LL)s[y]*(s[y]-1)*(n-s[y])*2;f[y]=x;s[x]+=s[y];val[x]+=val[y]-(LL)size[y]*size[y]-(LL)(n-size[y])*(n-size[y]);ans+=(LL)(n-s[x])*(n-s[x])*s[x]-val[x]*s[x]+get(s[x])+(LL)s[x]*(s[x]-1)*(n-s[x])*2;
}int main()
{n=read();for (int i=1;i<n;i++){int x=read(),y=read();addedge(x,y);}ans=(LL)n*(n-1)*(n-1);dfs(1);printf("%lld\n",ans);for (int i=1;i<=n;i++) f[i]=i,s[i]=1;int q=read();while (q--){int x=read(),y=read();x=find(x);y=find(y);if (dep[x]<dep[y]) std::swap(x,y);while (x!=y){if (dep[x]<dep[y]) std::swap(x,y);merge(find(fa[x]),x);x=find(fa[x]);}printf("%lld\n",ans);}return 0;
}

Codeforces 855G Harry Vs Voldemort 边双连通分量+并查集相关推荐

  1. BZOJ 2959: 长跑 [lct 双连通分量 并查集]

    2959: 长跑 题意:字词加入边,修改点权,询问两点间走一条路径的最大点权和.不一定是树 不是树? 把边双连通分量缩为一点! 怎么缩? 用一个并查集维护连通性,另一个并查集维护每个点所在边双的编号, ...

  2. POJ 3694 Network ★(边双连通分量+并查集缩点+LCA)

    [题意]一个无向图可以有重边,下面q个操作,每次在两个点间连接一条有向边,每次连接后整个无向图还剩下多少桥(每次回答是在上一次连边的基础之上) [分析]好题,做完后涨了很多姿势~ 普通做法当然就是每加 ...

  3. 【POJ - 3694】Network(对dfn求lca 或 缩点+lca 或 边双连通+并查集)

    题干: 网络管理员管理大型网络.该网络由N台计算机和成对计算机之间的M链路组成.任何一对计算机都通过连续的链接直接或间接连接,因此可以在任何两台计算机之间转换数据.管理员发现某些链接对网络至关重要,因 ...

  4. Codeforces Round #548 (Div. 2)C. Edgy Trees 并查集

    codeforces 1139C 题目链接:http://codeforces.com/contest/1139/problem/C 题意: 给你一个n个结点n-1条边的无向连通图,由红边和黑边组成. ...

  5. Codeforces Round #260 (Div. 1) C. Civilization(dfs+并查集)

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  6. 【CodeForces - 616C】The Labyrinth(bfs,并查集,STLset)

    题干: 求每个*能够到达的格子数量,只有.可以走(四个方向扩展),结果mod 10,替换 * 后输出. Input The first line contains two integers n, m  ...

  7. [Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分)

    [Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分) 题面 给出一个无向图,以及q条有向路径.问是否存在一种给边定向的方案,使得 ...

  8. Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)...

    转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2194090a96bbed2db1351de8.html 基本概念: 1.割点:若删掉某点后,原连通图 ...

  9. AcWing 397. 逃不掉的路(边双连通分量缩点成树 + 树链剖分乱搞)

    整理的算法模板合集: ACM模板 我们知道在同一个边双连通分量中的点没有必经边(因为至少有两条分离的路径). 所以我们直接tarjan求出桥后缩点,然后求一下树上两点间的距离即可. 那么如何求树上两点 ...

  10. UVA1364 Knights of the Round Table(双连通分量、二分图染色,超详细解释)

    整理的算法模板合集: ACM模板 UVA1364 Knights of the Round Table 题目中要求互相有憎恨关系的人不能坐在相邻的位置,一个圆桌可以很形象地看作是一个环,也就是说我们两 ...

最新文章

  1. alpha事后诸葛亮
  2. 电气simulink常用模块_16种常用模块电路分析,电气工程师的必备
  3. P2473 [SCOI2008]奖励关
  4. 运动控制卡的基类函数与实现例子
  5. 【2021.02.09更新】数学常用基本公式
  6. 什么是Docker?看这一篇干货文章就够了!
  7. 华科计算机专硕英语几,考研考华科计算机考数学几英语几啊,另外考华科数..._考研_帮考网...
  8. oracle监听器启动停止,Oracle 10g 监听器启动后停止的解决办法
  9. Python中从零开始的简单遗传算法
  10. 一步步编写avalon组件02:分页组件
  11. 2022 XbotPark(冬季)科创训练营重庆明月湖站总结
  12. Android Tips 8
  13. html引入png不显示透明北京,完美解决透明png图片及透明png背景,兼容所有浏览器...
  14. 耳穴减肥自身感受细节描述0422
  15. js prototype原形
  16. 如何使用DD-WRT增强Wi-Fi网络信号并增加范围
  17. pycharm能不能编写Java_使用Pycharm编写第一个Python程序
  18. Kali Linux 安装搜狗拼音输入法
  19. java计算方法所耗费的时间
  20. React Native 启动流程 源码剖析

热门文章

  1. 【前端开发】在windows 10上安装gulp(详细讲解)
  2. 多双系统下蓝牙键盘鼠标的共享配对问题解决办法:win + debian + arch~IRK、LTK、ERand、EDIV、CSRK
  3. 计算机应用能力考试ppt2003,全国专业技术人员计算机应用能力考试_PPT_2003_题库版...
  4. vue3 tsx语法
  5. Mac安装Royal TSX
  6. 机器学习经典模型简单使用及归一化(标准化)影响
  7. 人机对战五子棋(权值法)
  8. 中医文化之熏蒸的历史
  9. 【微软内推】微软2023届校园招聘开始啦
  10. ORACLE获取月初、月末日期