https://www.acwing.com/problem/content/354/

在没有附加边的情况下,我们发现这是一颗树,那么再添加条附加边(x,y)后,会造成(x,y)之间产生一个环
如果我们第一步截断了(x,y)之间的一条路,那么我们第二次只能截掉(x,y)之间的附加边,才能使其不连通;
我们将每条附加边(x,y)称为将(x,y)之间的路径覆盖了一遍;
因此我们只需要统计出每条主要边被覆盖了几次即可;
对于只被覆盖一次的边,第二次我们只能切断(x,y)边,方法唯一;
如果我们第一步切断了被覆盖0次的边,那么我们已经将其分为两部分,那么第二部只需要在m条附加边中任选一条即可,如果第一步截到被覆盖超过两次的边,将无法将其分为两部分;
运用乘法原理,我们累加答案;
那么怎么标记我们的边(x,y)被覆盖了几次呢,那么我们可以使用树上差分,是解决此类问题的经典套路;
我们想,对于一条边(x,y),我们添加一条边;
那么只会对x到lca(x,y)到y上的边产生影响,对于(x,y)我们将x节点的权值+1,y节点的权值+1,另lca(x,y)的权值-2,画图很好理解,那么我们进行一遍dfs将差分数组还原成原数组,求出每个节点权值,那么这个值就是节点父节点连边被覆盖的次数,按上述方法累加答案即可;

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>using namespace std;const int N = 100007, M = 2000007, INF = 0x3f3f3f3f;int n,m;
int ver[M], edge[M], nex[M], head[M], tot;
int deep[N];
bool vis[N];
int d[N];
int q[N];
int ans;
int f[N][20];void add(int x,int y){ver[tot] = y;nex[tot] = head[x];head[x] = tot ++ ;
}void bfs(){deep[1] = 1;int hh = 0,tt = 0;q[tt ++ ] = 1;while(hh != tt){int x = q[hh ++ ];if(hh == N)hh = 0;for(int i = head[x];~i;i = nex[i]){int y = ver[i];if(deep[y])continue;deep[y] = deep[x] + 1;q[tt ++ ] = y;if(tt == N)tt = 0;f[y][0] = x;for(int k = 1;k <= 16;++k)f[y][k] = f[f[y][k - 1]][k - 1];}}}int lca(int x,int y){if(deep[x] <= deep[y])swap(x,y);for(int k = 16;k >=0;k --)if(deep[f[x][k]] >= deep[y])x = f[x][k];if(x == y)return x;for(int k = 16;k >= 0;k--)if(f[x][k] != f[y][k])x = f[x][k],y = f[y][k];return f[x][0];
}int dfs(int x ,int fa){int res = d[x];for(int i = head[x];~i;i = nex[i]){int y = ver[i];if(y == fa)continue;int s = dfs(y,x);if(s == 0)ans += m;else if(s == 1)ans ++;res += s;}return res;
}int main(){memset(head,-1,sizeof head);scanf("%d%d",&n,&m);for(int i = 1;i < n;++i){int x,y;scanf("%d%d",&x,&y);add(x,y);add(y,x);}bfs();for(int i = 1;i <= m;++i){int x,y;scanf("%d%d",&x,&y);int p = lca(x,y);d[x] ++ ,d[y] ++ ,d[p] -=2;}dfs(1,-1);printf("%d\n",ans);return 0;
}

解题报告:AcWing 352. 闇の連鎖(树上差分、方案统计)相关推荐

  1. 解题报告:P5960 【模板】差分约束算法(及常用技巧)

    P5960 [模板]差分约束算法 差分约束系统 给出 n 个变量和 m 个约束条件,形如 xi−xj≤ckx_i - x_j \leq c_kxi​−xj​≤ck​,你需要求出一组解,使得所有约束条件 ...

  2. 解题报告 『[Poetize6]IncDec Sequence(差分)』

    原题地址 差分,想到了这个再看看代码应该就很好做了. 代码实现如下: #include <bits/stdc++.h> using namespace std; #define int l ...

  3. 【线段树合并】解题报告:luogu P4556雨天的尾巴 (树上对点差分 + 动态开点 + 线段树合并)线段树合并模板离线/在线详解

    题目链接:雨天的尾巴 本题本身是一个非常简单的一道树上差分的模板题,但是由于变态的数据范围,我们直接用数组是存不下的(本来使用一颗普通的线段树直接维护最大值即可.但是本题的空间只有128MB,直接按照 ...

  4. [NOIP 2015]运输计划-[树上差分+二分答案]-解题报告

    [NOIP 2015]运输计划 题面: A[NOIP2015 Day2]运输计划 时间限制 : 20000 MS 空间限制 : 262144 KB 问题描述 公元 2044 年,人类进入了宇宙纪元. ...

  5. P5488 差分与前缀和 解题报告

    P5488 差分与前缀和 解题报告 link 题目大意 给定一个长度为 n n n 的序列 a i a_i ai​ ,求其 k k k 阶差分或前缀和.对 1004535809 取模. 1 ≤ n ≤ ...

  6. 解题报告(十八)数论题目泛做(Codeforces 难度:2000 ~ 3000 + )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  7. 【HDU - 5452】Minimum Cut(树形dp 或 最近公共祖先lca+树上差分,转化tricks,思维)

    题干: Given a simple unweighted graph GG (an undirected graph containing no loops nor multiple edges) ...

  8. 解题报告(三)多项式求值与插值(拉格朗日插值)(ACM / OI)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  9. 解题报告:【kuangbin带你飞】专题九 连通图

    目录 A.POJ 1236 Network of Schools(有向图缩点) B.UVA 315 Network(找割点) C.UVA 796 Critical Links(桥) D.POJ 369 ...

最新文章

  1. 1977中文版_历年星云、雨果获奖长篇中文版汇总
  2. Ubuntu下通过CMake文件编译CUDA+OpenCV代码操作步骤
  3. 远程管理技巧之二—远程修改客户端注册表
  4. 从黄昏到夜暮 2021-04-15
  5. B端数据表格设计实战指南(建议收藏)
  6. zabbix3 mysql_mysql分表-zabbix3.x
  7. 使用WinAPI替代System.IO.Directory
  8. java socket 中文乱码_java-Socket接受中文乱码的解决 | 学步园
  9. linux邮件收发程序流程图,[源码和文档分享]基于C语言和TCP Socket实现的Linux环境下的邮件收发客户端程序...
  10. ElementUI:tree给节点添加icon图标
  11. python的语法格式
  12. 官方ISO9001认证过程管理方法PDCA
  13. 公司员工考勤系统Java代码
  14. linux系统USB转网卡驱动异常,usb 网卡驱动安装问题(芯片AX88772B)
  15. 淘宝商品描述信息查询API接口(淘宝商品详情API接口)
  16. 内网地址映射为外网地址方法
  17. 基于微型计算机系统的报警器设计,防盗报警器的设计毕业设计分析.doc
  18. win7 64位系统加载dsoframer.ocx问题解决方法
  19. 项目管理知识体系指南(七)项目质量管理
  20. 一道题带你认识ACM竞赛

热门文章

  1. 笔记 | PyTorch安装及入门教程
  2. hive 表的常用操作
  3. 网页热点区域神器工具大曝光
  4. zabbix监控添加psql数据库和sql_server数据库模板
  5. CentOS之——CentOS7安装iptables防火墙
  6. 使用Composer安装Laravel步骤
  7. divideSentence
  8. 小米输掉官司,倒打一耙不如坦然认错
  9. linux shell bash 内置变量参考
  10. 2010年7月blog汇总:OpenTest、MetaModelEngine和敏捷个人