LOJ #10131 「一本通 4.4 例 2」暗的连锁

给一棵 \(n\) 个点的树加上 \(m\) 条非树边 , 现在需要断开一条树边一条非树边使得图不连通 , 求方案数 .

$n \le 10^5 , m \le 2*10^5 $ , 保证答案在 \(int\) 范围内.

对于每条非树边 , 覆盖 \(x\) 到 \(LCA\) 和 \(y\)到 \(LCA\) 的边 , 即差分算出每个点和父亲的连边被覆盖了多少次 .

被覆盖 \(0\) 次的边可以和 \(m\) 条非树边搭配 , 被覆盖 \(1\) 次的边可以和唯一的非树边搭配 , \(2\) 次以上的不能产生贡献 .

时间复杂度 \(O(n+m)\)

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define Debug(x) cout<<#x<<"="<<x<<endl
#define log2 LLLLog2
using namespace std;
typedef long long LL;
const int INF=1e9+7;
inline LL read(){
register LL x=0,f=1;register char c=getchar();
while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
while(c>=48&&c<=57)x=(x<<3)+(x<<1)+(c&15),c=getchar();
return f*x;
} const int N = 3e5 + 5;
const int M = 6e5 + 5;
const int logN = 20; struct Edge{
int v,w,nxt;
}e[M];
int first[N],Ecnt=0;
inline void Add_edge(int u,int v,int w=0){
e[++Ecnt]=(Edge){v,w,first[u]};
first[u]=Ecnt;
} int fa[N][logN], dep[N], tag[N], log2[N];
int n, m, ans; inline void dfs1(int u, int pre){
fa[u][0] = pre, dep[u] = dep[pre] + 1;
for(int i = 1; fa[u][i - 1]; ++i){
fa[u][i] = fa[fa[u][i - 1]][i - 1];
}
for(int i = first[u]; i; i = e[i].nxt){
int v = e[i].v;
if(v != pre) dfs1(v, u);
}
} inline int LCA(int x, int y){
if(dep[x] < dep[y]) swap(x, y);
for(int i = log2[dep[x] - dep[y]]; i >= 0; --i){
if(dep[fa[x][i]] >= dep[y]){
x = fa[x][i];
}
}
if(x == y) return x;
for(int i = log2[dep[x]]; i >= 0; --i){
if(fa[x][i] != fa[y][i]){
x = fa[x][i], y = fa[y][i];
}
}
return fa[x][0];
} inline void dfs2(int u, int pre){
for(int i = first[u]; i; i = e[i].nxt){
int v = e[i].v;
if(v == pre) continue;
dfs2(v, u);
tag[u] += tag[v];
}
} int main(){
n = read(), m = read();
log2[0] = -1;
for(int i = 1; i <= n; ++i) log2[i] = log2[i >> 1] + 1;
for(int i = 1; i < n; ++i){
int x = read(), y = read();
Add_edge(x, y);
Add_edge(y, x);
}
dfs1(1, 0);
for(int i = 1; i <= m; ++i){
int x = read(), y = read(), p = LCA(x, y);
++tag[x], ++tag[y], tag[p] -= 2;
}
dfs2(1, 0);
for(int i = 2; i <= n; ++i){
if(tag[i] == 0) ans += m;
if(tag[i] == 1) ans += 1;
}
printf("%d\n", ans);
}

LOJ #10131 「一本通 4.4 例 2」暗的连锁的更多相关文章

  1. LOJ10131. 「一本通 4.4 例 2」暗的连锁【树上差分】

    LINK solution 很简单的题 你就考虑实际上是对每一个边求出两端节点分别在两个子树里面的附加边的数量 然后这个值是0第二次随便切有m种方案,如果这个值是1第二次只有一种方案 如果这个值是2或 ...

  2. LOJ#10064. 「一本通 3.1 例 1」黑暗城堡

    LOJ#10064. 「一本通 3.1 例 1」黑暗城堡 题目描述 你知道黑暗城堡有$N$个房间,$M$条可以制造的双向通道,以及每条通道的长度. 城堡是树形的并且满足下面的条件: 设$D_i$为如果 ...

  3. Loj 10115 「一本通 4.1 例 3」校门外的树 (树状数组)

    题目链接:https://loj.ac/problem/10115 题目描述 原题来自:Vijos P1448 校门外有很多树,学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的 ...

  4. LOJ#10065. 「一本通 3.1 例 2」北极通讯网络

    题目链接:https://loj.ac/problem/10065 题目描述 原题来自:Waterloo University 2002 北极的某区域共有 nnn 座村庄,每座村庄的坐标用一对整数 ( ...

  5. LOJ#10106. 「一本通 3.7 例 2」单词游戏

    题目链接:https://loj.ac/problem/10106 题目描述 来自 ICPC CERC 1999/2000,有改动. 有 NNN 个盘子,每个盘子上写着一个仅由小写字母组成的英文单词. ...

  6. LOJ #10132. 「一本通 4.4 例 3」异象石

    题目地址 LOJ 题解 神仙思路.思路参考自<算法竞赛进阶指南>. 考虑维护dfs序中相邻两个石头的距离,那么每次?的答案就是sum/2(首尾算相邻) 然后维护一下拿个平衡树/set维护一 ...

  7. LOJ #10222. 「一本通 6.5 例 4」佳佳的 Fibonacci

    题目链接 题目大意 $$F[i]=F[i-1]+F[i-2]\ (\ F[1]=1\ ,\ F[2]=1\ )$$ $$T[i]=F[1]+2F[2]+3F[3]+...+nF[n]$$ 求$T[n] ...

  8. LOJ 10138 -「一本通 4.5 例 1」树的统计

    树链剖分模板题,详见这篇博客.

  9. LOJ 10155 - 「一本通 5.2 例 3」数字转换

    前言 从现在开始,这个博客要写一些题解了.起初,开这个博客只是好玩一样,没事就写写CSS.JS,然后把博客前端搞成了现在这个样子.以前博客只是偶尔记录一些东西,刷题也从来不记录,最近受一些学长的影响, ...

随机推荐

  1. Flutter布局2--Align

    Align控件即对齐控件,能将子控件所指定方式对齐,并根据子控件的大小调整自己的大小. eg: 文字组件对齐于右下方 new Align( alignment: FractionalOffset.bo ...

  2. Archiva 不小心删掉了管理员权限怎么办

    Archiva 的界面和 UI 比较容易出问题. 在添加用户和为用户进行权限修改的时候,不小心连 admin 这个用户的权限都删掉了. 这个时候应该如何恢复 admin 这个用户的权限? 这个时候你可 ...

  3. 顺序表应用7:最大子段和之分治递归法(SDUT 3664)

    #include <bits/stdc++.h> using namespace std; const int maxn = 50005; int num = 0; struct node ...

  4. JS 时间转换函数 字符串时间转换毫秒(互转)

    字符串转化为日期 let util = function(){ Date.prototype.Format = function(fmt) { var o = { "M+" : t ...

  5. 指针——可能我学的还只是c++的皮毛

    C. 线性链表的插入与删除 单点时限: 2.0 sec 内存限制: 256 MB 实现线性链表的插入与删除操作 只需完成给定函数的定义. NODE* insertLinklist(NODE* head ...

  6. pandas入门之DataFrame

    创建DataFrame - DataFrame是一个[表格型]的数据结构.DataFrame由按一定顺序排列的多列数据组成.设计初衷是将Series的使用场景从一维拓展到多维.DataFrame既有行 ...

  7. Matlab下imwrite,Uint16的深度图像

    Matlab下imwrite,Uint16的深度图像 1. 在Matlab命令窗口输入命令: help imwrite 会有如下解释: If the input array is of class u ...

  8. js面向对象入门

    通常我们写js以及调用: function init(){ console.log("init") } function load(){ console.log("loa ...

  9. java课后实验性问题7

    1.异常处理 import javax.swing.*; class AboutException { public static void main(String[] a) { int i = 1, ...

  10. Job for keepalived.service failed because the control process exited with error code. See "systemctl status keepalived.service" and "journalctl -xe" for details.

    解决方案 https://blog.csdn.net/zt15732625878/article/details/86493096