补题链接:Here

题意总结:寻找有多少条两个点之间偶数路径

看完题,很容易想到在树型中,同一层的节点必然是偶数路径到达,还有就是每隔两层的节点一样可以到达,所以我就理所应当的写了如下代码

using ll    = long long;
const int N = 1e5 + 10;
vector<int> e[N], deg(N);
int dep[N], Siz[N];
int Mdep = -1;
void dfs(int u, int fa) {
for (int v : e[u]) {
if (v == fa) continue;
dep[v] = dep[u] + 1;
Mdep = max(Mdep, dep[v]);
Siz[dep[v]]++;
dfs(v, u);
}
}
void solve() {
int n;
cin >> n;
for (int i = 1, u, v; i < n; ++i) {
cin >> u >> v;
e[u].push_back(v);
e[v].push_back(u);
deg[v]++;
}
int root = 0;
for (int i = 1; i <= n && !root; ++i)
if (!deg[i]) root = i;
dep[root] = 1, Siz[1] = 1;
dfs(root, -1);
ll ans = 0;
for (int i = 1; i <= Mdep; ++i) {
ans += Siz[dep[i]] * (Siz[dep[i]] - 1) / 2;
for (int j = i + 2; j <= Mdep; j += 2)
ans += Siz[dep[i]] * Siz[dep[j]];
}
cout << ans << "\n";
}

然后就GG了,通过率为 \(0\%\)

WA之后重新理解一下题意,发现这个就是一道枚举起点和终点的 \(LCA\) ,然后将他们两两组合即可。

具体的,设 \(f[i][0/1]\)表示以 \(i\) 为根的子树中,与根节点 \(i\) 的距离为偶数(0)奇数(1)的点的数量。

转移方程:\(f[u][x] += f[v][x ⊗ 1]\)

然后考虑统计答案,以 \(u\) 为 \(LCA\) 的两个节点,肯定不能在\(u\) 的同一个儿子里,所以转移的过程中, \(f[u][0/1]\) 表示已经当前已经计算过得儿子造成的贡献,对于一个新的儿子 \(v\), \(ans += f[u][0]·f[v][1] + f[u][1]·f[v][0]\)

AC 代码:

using ll    = long long;
const int N = 1e5 + 10;
vector<int> e[N];
ll ans = 0, f[N][2];
void dfs(int u, int fa) {
f[u][0] = 1;
for (int v : e[u]) {
if (v == fa) continue;
dfs(v, u);
ans += f[v][1] * f[u][0];
ans += f[v][0] * f[u][1];
f[u][0] += f[v][1];
f[u][1] += f[v][0];
}
}
void solve() {
int n;
cin >> n;
for (int i = 1, u, v; i < n; ++i) {
cin >> u >> v;
e[u].push_back(v), e[v].push_back(u);
}
dfs(1, 0);
cout << ans << '\n';
}

顺便一句,以前牛客比赛的数据好水....,连下面这种代码都能过 \(60\%\)

using ll = long long;
ll dp[100010], ans, odd, even, n;
void solve() {
cin >> n;
for (int i = 1, u, v; i < n; ++i) {
cin >> u >> v;
dp[v] = dp[u] + 1;
ans += (dp[v] & 1 ? even++ : ++odd);
}
cout << ans << "\n";
}

【每日一题】16.Treepath (LCA + DP)的更多相关文章

  1. CISP/CISA 每日一题 16

    CISA 每日一题(答) 作业调度软件的优点: 1.作业信息仅需建立一次,减少错误发生概率: 2.可定义作业间的依赖关系,当某一项作业失败时,依赖于该作业的后续作业就不会被执行: 3.所有成功或失败的 ...

  2. 【JavaScript】【dp】Leetcode每日一题-解码方法

    [JavaScript]Leetcode每日一题-解码方法 [题目描述] 一条包含字母 A-Z 的消息通过以下映射进行了 编码 : 'A' -> 1 'B' -> 2 ... 'Z' -& ...

  3. 老男孩IT教育-每日一题汇总

    老男孩IT教育-每日一题汇总 第几天 第几周 日期 快速访问链接 第123天 第二十五周 2017年8月25日 出现Swap file….already exists以下错误如何解决? 第122天 2 ...

  4. [每日一题]面试官问:谈谈你对ES6的proxy的理解?

    [每日一题]面试官问:谈谈你对ES6的proxy的理解? 关注「松宝写代码」,精选好文,每日一题 作者:saucxs | songEagle 一.前言 2020.12.23 日刚立的 flag,每日一 ...

  5. 【JavaScript】Leetcode每日一题-青蛙过河

    [JavaScript]Leetcode每日一题-青蛙过河 [题目描述] 一只青蛙想要过河. 假定河流被等分为若干个单元格,并且在每一个单元格内都有可能放有一块石子(也有可能没有). 青蛙可以跳上石子 ...

  6. 【JavaScript】Leetcode每日一题-组合总和4

    [JavaScript]Leetcode每日一题-组合总和4 [题目描述] 给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target .请你从 nums 中找出并返回总和为 targ ...

  7. 【JavaScript】Leetcode每日一题-最大整除子集

    [JavaScript]Leetcode每日一题-最大整除子集 [题目描述] 给你一个由 无重复 正整数组成的集合 nums ,请你找出并返回其中最大的整除子集 answer ,子集中每一元素对(an ...

  8. 【JavaScript】Leetcode每日一题-矩形区域不超过K的最大值和

    [JavaScript]Leetcode每日一题-矩形区域不超过K的最大值和 [题目描述] 给你一个 m x n 的矩阵 matrix 和一个整数 k ,找出并返回矩阵内部矩形区域的不超过 k 的最大 ...

  9. 【python】Leetcode每日一题-扰乱字符串

    [python]Leetcode每日一题-扰乱字符串 [题目描述] 使用下面描述的算法可以扰乱字符串 s 得到字符串 t : 如果字符串的长度为 1 ,算法停止 如果字符串的长度 > 1 ,执行 ...

  10. 【python】Leetcode每日一题-打家劫舍2

    [python]Leetcode每日一题-打家劫舍2 [题目描述] 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金.这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋 ...

随机推荐

  1. uni-app学习笔记——路由与页面跳转

    小颖最近在学习小程序,怕自己前看后忘,毕竟还没开始进入项目实践中,就自己瞎倒腾嘻嘻,今天来看下  uni-app  的路由与页面跳转,小颖就简单列举下它们的用法,具体的大家可以看官网哦!啦啦啦啦啦  ...

  2. DES加密技术概述与应用

    一.引言 随着信息技术的飞速发展,数据安全已成为越来越受到重视的问题.数据加密技术作为保障信息安全的核心技术之一,得到了广泛的研究和应用.DES(Data Encryption Standard)作为 ...

  3. C++学习笔记一:windows系统配置C++开发环境(VS code+g++/clang++)

    1.下载vscode 官网下载地址: https://code.visualstudio.com/ 安装时选择把软件加入到环境变量中这个选项 2.打开vscode,安装c/c++扩展插件 3.下载gc ...

  4. Scrapy框架架构

    ENGINE:引擎,负责各个组件的管理. SPIDERS:各个爬虫文件类.(我们一般要写的代码就是这个). SCHEDULER:调度器,ENGINE将爬虫任务分发给该组件,由该组件调度爬虫任务. DO ...

  5. 华企盾DSC邮件服务器测试连接提示Bad login or password(账号密码错误)

    解决方法:出现该提示说明账号和密码有一个填错了,注意:这里的密码不是邮箱本身的密码,是授权码,具体可以在邮箱设置中查看,而且必须开启smtp服务才能正常使用.

  6. StringBuilder、StringBuffer

    StringBuilder 1.concat() 拼接字符串 2.indexOf() 查找 3.replace() 替换 4.subString(1,2) 截取 0,1,2 1开始 2结束 Strin ...

  7. shell中 << EOF 和 EOF 使用

    转载请注明出处: EOF(End of File)在Shell中通常用于指示输入的结束,并在脚本或命令中进行多行输入.它允许用户指定一个特定的分界符来表示输入的结束,通常用于创建临时文件.重定向输入或 ...

  8. MinIO客户端之mv

    MinIO提供了一个命令行程序mc用于协助用户完成日常的维护.管理类工作. 官方资料 mc mv 将对象在桶之间移动. 在桶内准备好待移动的文件,检查对象,命令如下: ./mc ls local1/b ...

  9. Pikachu漏洞靶场 Sql Inject(SQL注入)

    SQLi 哦,SQL注入漏洞,可怕的漏洞. 文章目录 SQLi 数字型注入(post) 字符型注入(get) 搜索型注入 xx型注入 "insert/update"注入 inser ...

  10. 【Python】【OpenCV】OCR识别(二)——透视变换

    对于OCR技术在处理有角度有偏差的图像时是比较困难的,而水平的图像使用OCR识别准确度会高很多,因为文本通常是水平排列的,而OCR算法一般会假设文本是水平的. 针对上述情况,所以我们在处理有角度的图象 ...