题意

N个节点的树,每条边有条权值,问有多少个点对(U,V)(U, V)(U,V),使得UUU到VVV的距离是3的倍数。

思路

  • dfs1dfs1dfs1处理每个节点包含子树的dis[dis[%3 = 0],dis[%3 = 1],dis[%3 = 2]dis[的个数。
  • dfs2dfs2dfs2枚举每个节点作为根节点的情况。

牛客OJ好像有问题。一样的代码:

#include <bits/stdc++.h>
#define LL long long
#define P pair<int, int>
#define lowbit(x) (x & -x)
#define mem(a, b) memset(a, b, sizeof(a))
#define mid ((l + r) >> 1)
#define lc rt<<1
#define rc rt<<1|1
#define endl '\n'
const int maxn = 1e5 + 5;
const int inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;
using namespace std;
vector<P> g[maxn];
int dp[maxn][3];
LL ans;
void dfs1(int u, int fa) {mem(dp[u], 0);dp[u][0] = 1;for (auto it : g[u]) {int v = it.first;int w = it.second;if (v == fa) continue;dfs1(v, u);dp[u][0] += dp[v][(3 - w) % 3];dp[u][1] += dp[v][(4 - w) % 3];dp[u][2] += dp[v][(5 - w) % 3];}
}
void dfs2(int u, int fa, int sum0, int sum1, int sum2) {ans += sum0 - 1;for (auto it : g[u]) {int v = it.first;int w = it.second;if (v == fa) continue;int other[3];other[0] = sum0 - dp[v][(3-w)%3];other[1] = sum1 - dp[v][(4-w)%3];other[2] = sum2 - dp[v][(5-w)%3];dfs2(v, u, other[(3-w)%3]+dp[v][0], other[(4-w)%3]+dp[v][1], other[(5-w)%3]+dp[v][2]);}
}int main () {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int T;cin >> T;while (T--) {int n;cin >> n;for (int i = 0; i <= n; ++i) {g[i].clear();}for (int i = 1, u,v,w; i < n; ++i) {cin >> u >> v >> w;g[u].push_back(make_pair(v, w%3));g[v].push_back(make_pair(u, w%3));}ans = 0;dfs1(1, 0);dfs2(1, 0, dp[1][0], dp[1][1], dp[1][2]);cout << ans / 2 << endl;}return 0;
}

牛客 contest897 C-Latale(树上dp)相关推荐

  1. 【牛客 - 157F】三轮(dp,分治fft)

    题干: 链接:https://ac.nowcoder.com/acm/contest/157/F 来源:牛客网 小k有一个三轮,它最多可以装105大小的东西 小k有n种商品,他要准备出摊了 每种商品体 ...

  2. 牛客 - WY28 跳石板 (dp)

    牛客 解题思路: 将1 - M个石板看做一个结果数组stepNum,每个stepNum[i]储存着从起点到这一步最小的步数,其中0为不 能到达. 从起点开始对stepNum进行遍历,先求i的所有约数( ...

  3. 牛客 - 血压游戏(虚树+dp)

    题目链接:点击查看 题目大意:中文题,不难理解 题目分析:这个题目比赛的时候没来得及看,比赛结束后看到有大佬写了一篇长链剖分+线段树的题解就被吓到了(主要是感觉太麻烦了,懒得去补了),读完题后总感觉似 ...

  4. 牛客 - 数位操作2(数位dp)

    题目链接:点击查看 题目大意: 给了你一个极端大的数据集合的信息 N, SUM, X 如下 这个数据集合里面的N位, 每一数位求和之后刚好等于SUM (比如四位数 1234 数位求和之后是 10); ...

  5. 牛客 - 张老师的旅行(dp)

    题目链接:点击查看 题目大意:中文题面 题目分析:最优性问题,读完题后感觉不是最短路就是 dp 了,喊队友读了一遍题后确定是 dp 了 n 只有 1e3 ,所以可以支持二维 dp 的定义,因为涉及到数 ...

  6. 牛客 - 汉诺塔(思维+dp)

    题目链接:点击查看 题目大意:给出 n 个木板,尺寸分别为 Xi * Yi ,现在要求将其分为最少的组,每一个组中都可以通过重新排序使得每个木板都严格递增,此处递增的意思为严格满足 Xi > X ...

  7. 牛客网-最小花费【dp】

    十分钟找出递推关系式,10分钟wa我可真是个憨憨 ,状态转移其实蛮明显的, 记dp[i]为从a到第i个车站的最小花费 从起始位置a开始不断向前寻找,每次前向找到所有 距 离 ≤ l 3 距离\leq ...

  8. 牛客--卡牌游戏 (概率DP 逆推) P2059

    题目链接:卡牌游戏 n个人,m张卡牌上有m个数字.庄家随机一张卡牌,数字为X,第X位出局,随后第X位的下一位做庄家,问,每个人最后获胜的概率是多少? 约瑟夫环的变形问题,这里每次等概率的抽牌,数字相对 ...

  9. 牛客oj--- xinjun与阴阳师(背包dp)

    xinjun与阴阳师 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262144K 64bit IO Format: %lld 题目描述 xinjun是各类手 ...

最新文章

  1. 3x3,5x5,7x7卷积核识别效率对比
  2. java 对字符串中的数值排序
  3. STM32开发 -- patch生成和使用
  4. linux+mysql+导出备份_Linux系统MySQL备份的导入导出的具体分析
  5. 上达最高精度,下到最快速度,Scaled-YOLOv4:模型缩放显神威
  6. vector使用中可能出现的一个陷阱
  7. 关注健康,从现在开始(视力篇)
  8. 批量修改文本文件编码GB18030为UTF-8
  9. 如何保证软件质量?汽车软件基于模型开发的十个问题与质量工具推荐
  10. java classpath的配置_java的classpath怎么配置
  11. 自己动手写开源爬虫框架 Slit
  12. 三角函数泰勒级数推导
  13. 【Redshift渲染器渲染出图片有色差(红移渲染器)】
  14. STM32通用定时器实现us微秒延时
  15. sigmoid函数sigmoid求导
  16. 天然肠衣数学建模matlab代码,数学建模天然肠衣搭配问题.doc
  17. 信息学奥赛一本通(C++版) 网站补充题目
  18. canvas根据坐标点绘制图形
  19. C++程序设计课程设计(研究生初试录取系统)
  20. veri776数据集求助

热门文章

  1. 你对一个程序员有多尊重
  2. 【Linux】scp“免密” 远程copy较多文件
  3. hdu 2160 母猪的故事(睡前随机水一发)(斐波那契数列)
  4. java field, property,variable及getField和getDeclaredField的区别
  5. php项目技术选型方案,php-现有资源下,项目技术选型求助
  6. [网络安全自学篇] 五十五.Windows系统安全之构建ROP链绕过DEP及原理详解
  7. 【数据结构与算法】之深入解析“格雷编码”的求解思路与算法示例
  8. Python之深入解析如何制作国际空间站实时跟踪器
  9. 电商三巨头交成绩单,这次拼多多输了吗?
  10. 人工智能实践之旅 —— 简单说说主要内容和安排