poj3471 - 倍增+LCA+树上差分
题意:一张n节点连通无向图,n-1条树边,m条非树边。若通过先删一条树边,再删一条非树边想操作
将此图划分为不连通的两部分,问有多少种方案。
利用LCA整好区间覆盖,dfs用来求前缀和
需要注意的是,覆盖数为1的时候才可以选择哦!
覆盖数为0,代表可以直接拆开
最后附上一张我老婆
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#define maxn 110000
using namespace std;
typedef long long ll;
int dp[maxn][33];
int dep[maxn];
long long cnt[maxn];//差分数组
int head[450100]; struct Node {
int to;
int next;
}G[450100];
int cnn = 1;
void insert(int be, int en) {
G[cnn].to = en; G[cnn].next = head[be]; head[be] = cnn;;//头插法
cnn++;
} void dfs(int u, int par) {
dep[u] = dep[par] + 1;
for (int i = 0; i <= 21; i++) {
dp[u][i + 1] = dp[dp[u][i]][i];
}
for (int i = head[u]; i; i = G[i].next) {
int p = G[i].to;
if (p == par) continue;
dp[p][0] = u;
dfs(p, u);
}
return;
}
int LCA(int x, int y) {
if (dep[x] < dep[y]) swap(x, y);//x在下面
for (int i = 20; i >= 0; i--) {
if (dep[dp[x][i]] >= dep[y]) x = dp[x][i];
if (x == y) return x;
} for (int i = 20; i >= 0; i--) {
if (dp[x][i] != dp[y][i]) {
x = dp[x][i];
y = dp[y][i]; }
} return dp[x][0];
}
int n, m;
int find(int x,int par) { for (int i = head[x]; i; i = G[i].next) {
int p = G[i].to;
if (p == par) continue;
find(p, x);
cnt[x] += cnt[p];
} return 0;
}
int main() {
scanf("%d %d", &n, &m);
int be, en;
for (int i = 0; i < n - 1; i++) {
scanf("%d %d", &be, &en);
insert(be, en);
insert(en, be);
}
dp[1][0] = 1;
dfs(1, 0);
for(int i=0;i<m;i++) {
scanf("%d %d", &be, &en);
int p = LCA(be, en);
cnt[p] -= 2;
cnt[be]++;
cnt[en]++;
}
find(1, 0);
ll ans = 0; for (int i = 2; i <= n; i++) {
if (cnt[i] == 0) ans += m;//乘法原理
else if (cnt[i] == 1) ans++;
}
printf("%lld\n", ans);
return 0;
}
poj3471 - 倍增+LCA+树上差分的更多相关文章
- 洛谷P2680 运输计划(倍增LCA + 树上差分 + 二分答案)
[题目链接] [思路]: 根据题意可以明显看出,当所有任务都完成时的时间是最终的结果,也就是说本题要求,求出最小的最大值. 那这样的话就暗示了将答案二分,进行check. [check方法]: 如果说 ...
- [BZOJ3307]:雨天的尾巴(LCA+树上差分+权值线段树)
题目传送门 题目描述: N个点,形成一个树状结构.有M次发放,每次选择两个点x,y对于x到y的路径上(含x,y)每个点发一袋Z类型的物品.完成所有发放后,每个点存放最多的是哪种物品. 输入格式: 第一 ...
- UVA1265 Tour Belt Kruskal重构树、倍增、树上差分
题目传送门 题意:定义$Tour \, Belt$为某张图上的一个满足以下条件的点集:①点集中至少有$2$个点②任意两点互相连通③图上两个端点都在这个点集中的边的权值的最小值严格大于图上只有一个端点在 ...
- [BZOJ3631]:[JLOI2014]松鼠的新家(LCA+树上差分)
题目传送门 题目描述: 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在“树”上.松鼠想邀 ...
- 洛谷P3258 [JLOI2014]松鼠的新家【LCA+树上差分】
简要题意 树上n个节点,给定路径,求每个点经过次数 题意分析 对于每两个点,有两种情况,第一种,他们的lca为本身,第二种,他们有公共祖先,又要求他们的点经过次数,暴力是不可能的,复杂度不对,所以可以 ...
- 运输计划[二分答案 LCA 树上差分]
也许更好的阅读体验 \(\mathcal{Description}\) 原题链接 概括一下题意 给一颗有\(n\)个点带边权的树,有\(m\)个询问,每次询问\(u,v\)两点间的权值和,你可以将树中 ...
- [luogu P3128][USACO15DEC]Max Flow [LCA][树上差分]
题目描述 Farmer John has installed a new system of pipes to transport milk between the stalls in his b ...
- bzoj4326 树链剖分 + 线段树 // 二分 lca + 树上差分
https://www.lydsy.com/JudgeOnline/problem.php?id=4326 题意:N个点的树上给M条树链,问去掉一条边的权值之后所有树链长度和的最大值最小是多少. 首先 ...
- 2018.08.22 codves2370 小机房的树(lca+树上差分)
传送门 一道板子题. 直接树链剖分维护树上lca然后差分就行了. 代码: #include<bits/stdc++.h> #define N 50005 #define lc (p< ...
随机推荐
- python字符串、元组常用操作
常用字符串操作函数: #Author:CGQ name="I \tam ChenGuoQiang" print(name.capitalize())#首字母大写,其他都小写 pri ...
- pycharm 快捷键使用
1.Ctrl+/?键 = 选中行全部注释/解封: 2.Ctrl+D = 复制前一行: 3.Ctrl+Z = 撤销: 1.编辑(Editing) Ctrl + Space 基本的代码完成(类.方法.属性 ...
- @loj - 2174@ 「FJOI2016」神秘数
目录 @description@ @solution@ @accepted code@ @details@ @description@ 一个可重复数字集合 S 的神秘数定义为最小的不能被 S 的子集的 ...
- Data Flow-File Read-详细过程
- 12 Top Open Source Data Analytics Apps
1. Hadoop It would be impossible to talk about open source data analytics without mentioning Hadoop. ...
- Java 内存模型及GC原理 (转)
来源:http://blog.csdn.net/ithomer/article/details/6252552 一个优秀Java程序员,必须了解Java内存模型.GC工作原理,以及如何优化GC的性 ...
- Duplicate keys detected: '0'. This may cause an update error.
在运行vue项目的时候报了:[Vue warn]: Duplicate keys detected: ‘0’. This may cause an update error(错误,检测到重复的key值 ...
- oracle总是使用索引的第一个列
如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引. 译者按: 这也是一条简单而重要的规则. 见以下实例. SQL> ...
- phpstorm 中git 的使用
phpstorm 是一款不可多得的IDE 环境,它既是一款强大的编辑器,还是一款调试器,同时还是一款git 可视化管理工具哟,phpers 值得拥有.今天介绍的是他不为人知的强大功能 —— git. ...
- 第一种方式:cookie的优化与购物车实例
一 Cookie 的优化 1.1 一般而言,我们设置cookie是在php中设置 例如: <?php setcookie('testKey1','hello world',0,'/'); //# ...