补题链接: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. 洛谷3521 [POI2011]ROT-Tree Rotations(线段树合并)

    题意:给定一颗有 n 个叶节点的二叉树.每个叶节点都有一个权值pi​(注意,根不是叶节点),所有叶节点的权值构成了一个1∼n 的排列.对于这棵二叉树的任何一个结点,保证其要么是叶节点,要么左右两个孩子 ...

  2. 深度掌握TypeScript中的重载【函数重载、方法重载】

    深度掌握TypeScript中的重载[函数重载.方法重载] 1. 函数重载,方法重载的重要性 著名前端流行框架底层都用到函数重载,例如:Vue3 底层源码就多处使用到带泛型的函数重载.很多前端面试更是 ...

  3. 没错,数据库确实应该放入 K8s 里!

    昨天冯老板发了一篇文章探讨了为什么将数据库放入 K8S 中不是一个明智的选择. 如果是四年前有人质疑容器化数据库我觉得还可以 battle 一下,都 2023 年了还有人不能认清这个大势,我就有必要来 ...

  4. 使用Netty实现文件传输的HTTP服务器和客户端

    现在我们来用netty实现文件传输的HTTP服务器和客户端 pom依赖文件: <?xml version="1.0" encoding="UTF-8"?& ...

  5. tryhackme进攻性渗透测试-Advanced Exploitation 高级利用

    Steel Mountain 侦察 Nmap -sC -sV -O $IP -oN basic_scan.nmap Nmap -script=vuln $IP -oN vuln_scan.nmap 总 ...

  6. 后端程序员必会的前端知识-04:Vue3

    Vue 3 1. TypeScript 1) 动态类型的问题 前面我们讲过 js 属于动态类型语言,例如 function test(obj) { } obj 可能只是个字符串 test('hello ...

  7. Elasticsearch入门到进阶

    Elasticsearch 一.Elasticsearch 是什么(中文官网)? Elasticsearch 是一个分布式的免费开源搜索和分析引擎,适用于包括文本.数字.地理空间.结构化和非结构化数据 ...

  8. 聊一聊 C# 线程切换后上下文都去了哪里

    一:背景 1. 讲故事 总会有一些朋友是不是问一个问题,在 Windows 中线程做了上下文切换,请问被切的线程他的寄存器上下文都去了哪里?能不能给我挖出来?这个问题其实比较底层,如果对操作系统没有个 ...

  9. React Hook 之 Effect :同步与外部系统的数据

    有时组件中的数据需要与外部系统的数据或操作同步,React提供了Hook Effect. Effect 会在组件渲染后运行一些代码,以便将组件与 React 之外的某些系统同步,包比如浏览器 API. ...

  10. 解决 IDEA 报错ERROR:JAVA: 无效的源发行版: 11

    解决 IDEA 报错ERROR:JAVA: 无效的源发行版: 11 原因 一般都是创建工程的时候 一路next 默认选择了 Java Version 11, 而本地的jdk版本是 8 解决 File ...