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. [Luogu P1658] 购物

    题目链接 这道题的主要思想是贪心. 题目的要求用几个硬币将1~x的数都能够凑出的最少硬币个数.这里注意一下是都凑出而不是同时凑出. 先讨论什么时候无解.所有的自然数都可以用1堆砌而成.换而言之只要有1 ...

  2. 018_STM32程序移植之_串口接收中文

    (一)在平时数据传输中很少用到接收中文的情况,但是最近需要用到就花了半天时间来弄弄 (二)接收原理,从现在接收情况分析:一个中文占两个数据的空间,也就是两个十六进制可以转化成为一个中文 (三)示例情况 ...

  3. 路由器配置——基于区域的OSPF,MD5认证

    一.实验目的:掌握OSPF基于区域的MD5认证 二.拓扑图: 三.具体步骤配置 (1)R1路由器配置 Router>enable Router#configure terminal Enter ...

  4. c 判断字符是否为字母 (iswalpha example)

    #include <stdio.h> #include <wctype.h> int main () { ; wchar_t str[] = L"C++"; ...

  5. Ubuntu 14.04 下安装redis后运行redis-cli 报出redis Connection refused错误【已解决】

    在运行redis-cli运行后爆出错误,看了网上的都没有用例如:改ip,注释bind 127.0.0.1,或者是先运行./redis-server redis.conf,都没有用 只需要: 找到red ...

  6. codeforces gym #101161E - ACM Tax(lca+主席树)

    题目链接: http://codeforces.com/gym/101161/attachments 题意: 给出节点数为$n$的树 有$q$次询问,输出$a$节点到$b$节点路程中,经过的边的中位数 ...

  7. deepin安装下载,部署在虚拟机上

    第一次接触linux就用了很久的Ubuntu,后来尝试了Manjaro.Debian,还是用了Ubuntu,但是用VM虚拟机使用的ubuntu经常卡顿.我始终觉得ubuntu的默认桌面环境gnome可 ...

  8. 2019腾讯前端技术大会资源TWeb

    扫码关注公众号 回复“TWeb”即可获取“2019腾讯前端技术大会”的PPT

  9. iOS开发系列--地图与定位总结

    现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.例如你到了一个陌生的 ...

  10. 通过.zip安装eclipse插件

    参考地址https://stackoverflow.com/questions/5482554/how-to-install-plugin-for-eclipse-from-zip