补题链接: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. 【Javascript】什么是alert,alert怎么用

    alert()是javascript语言提供的一个警告框函数 他可以接受任意参数,参数就是警告框里的函数信息

  2. jmeter-json断言

    1.JSON 断言所在位置:断言->JSON 断言 2.JSON断言中的字段解析 Assert JSON Path exists:json 表达式,判断所字段是否存在,存在则为True, 否则为 ...

  3. WPF DataGrid真正意义上开箱即用的原生可动态更新全选状态的DataGridCheckBox

    本文由 飞羽流星(Flithor/毛茸茸松鼠先生/Squirrel.Downy)原创,欢迎分享转载,但禁止以原创二次发布原位地址:https://www.cnblogs.com/Flithor/p/1 ...

  4. [2020-2021 集训队作业] Tom & Jerry

    题目背景 自选题 by ix35 题目描述 给定一张包含 \(n\) 个顶点和 \(m\) 条边的 无向连通图,Tom 和 Jerry 在图上进行了 \(q\) 次追逐游戏. 在第 \(i\) 次游戏 ...

  5. [ABC265A] Apple

    Problem Statement A fruit store sells apples. You may perform the following operations as many times ...

  6. 效率工具:Hutool 嘎嘎香,被秀到了!

    在日常开发中,我们会使用很多工具类来提升项目开发的速度,而国内用的比较多的 Hutool 框架,就是其中之一. 先来看官方对于 Hutool 的定义: Hutool 是一个小而全的 Java 工具类库 ...

  7. 5分钟安装Kubernetes+带你轻松安装istio服务网格指南

    上次我跟大家简单介绍了一下Kubernetes的各个组件及其含义,本期本来计划带领大家一起学习一些常用命令,但我认为这种方式可能无法达到学习的效果.有可能你们会直接忘记,甚至可能没有兴趣去学.我也理解 ...

  8. ElasticSearch之Index modules

    索引的参数,分为两类: 静态参数,仅支持在创建索引时指定,或者关闭索引后指定. 动态参数,允许在索引工作期间指定或者修改. 静态参数 index.number_of_shards 默认值为1. 本参数 ...

  9. Python——第二章:字符的编码encode和解码decode

    相关阅读:字符集(Character Set)和编码(Encoding)的历史演化 字符集和编码的总结: 1. ASCII编码: 8bit, 1byte => 256(最大可表示)2. GBK编 ...

  10. Centos7——防火墙(Firewall)命令

    centos防火墙根据系统大致有2种,一种是centos6时代的iptables:一种是centos7时代的firewalld: CentOS 7中防火墙是一个非常的强大的功能,在CentOS 6.5 ...