题目还是有点坑的,我一开始以为删掉一些边,点也没了,不知道我是为什么会这么想…

其实这道题的意思是,给你一个树,让你删掉一些边,使得由树删掉边剩余的多个连通块每个连通块的权值和是k的倍数,求满足条件的剩余的边的最小权值和。注意还有一个条件:总的点权和就是k的倍数

当一道题没有思路的时候,我们考虑所有的可能的性质。

我们发现了一个性质:如果一个点的权值已经是k的倍数,我们可以直接把这条边删掉,也就是最小边权和不要这个点所链接的所有的边。这样剩下的点的权值和还是k的倍数(因为总的点权和就是k的倍数)。我们推广一下这个性质,也就是说所有权值和为k的倍数的连通块都可以不要,都可以单独隔开,也就是说这个权值和为k的倍数的连通块向外连的边我们都可以不要,所以我们可以直接dfs。维护一个当前连通块的权值和,最后回溯的时候,如果权值是k的倍数,我们就不要这个连通块的这条边,如果不是k的倍数,我们就脸上这个点,加上这个点的权值。最后总权值就是答案。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int N = 1e6 + 7, M = 5e6 + 7;int n, m, k, tot;
int head[N], ver[M], nex[M];
ll edge[M];
ll node[N];
ll sum[N], res;
bool vis[N];void add(int x, int y, int z)
{ver[tot] = y;edge[tot] = z;nex[tot] = head[x];head[x] = tot ++;
}void dfs(int x, int fa, int edge_id)
{vis[x] = 1;for(int i = head[x];~i; i = nex[i]){int y = ver[i];if(y != fa && !vis[y]){dfs(y, x, i);}}if(node[x] % k == 0)return ;res += edge[edge_id];node[fa] += node[x];
}int main()
{memset(head, -1, sizeof head);scanf("%d%d", &n, &k);for(int i = 1; i <= n; ++ i)scanf("%lld", &node[i]);for(int i = 1; i <= n - 1; ++ i){int x, y;ll z;scanf("%d%d%lld", &x, &y, &z);add(x, y, z);add(y, x, z);}dfs(1, 1, 1);printf("%lld\n", res);return 0;
}

【牛客挑战赛】我是 A 题相关推荐

  1. 牛客网Java刷题知识点之ArrayList 、LinkedList 、Vector 的底层实现和区别

    不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...

  2. 牛客挑战赛42 A.小睿睿的数列

    牛客挑战赛42 A.小睿睿的数列 题目链接 题目描述 小睿睿给了你一个长度为n的数列,他想问你该数列中满足条件(区间内存在某个数是区间内所有数的公因数)的最长区间有多少个 输入描述: 第一行 111 ...

  3. 【百日冲大厂】第十篇,牛客网选择题+编程题井字棋+密码强度等级

    前言: 大家好,我是良辰丫,刷题的第十篇,牛客网选择题+编程题井字棋+密码强度等级.

  4. 牛客挑战赛47 C 条件(Floyd bitset优化)

    牛客挑战赛47 C 条件 思路:首先我们要两个图,一个是一定能到达的,一个是可能到达的,如果我们使用floyd (n^3)就有可能会超时,因为只要求询问能否到达,所以权值只有0和1,那我们可以使用bi ...

  5. 牛客挑战赛47 A 一道GCD问题

    牛客挑战赛47 A 一道GCD问题 思路参考牛客上的题解: 根据多维的更相减损术得gcd(x,y,z)=gcd(x,y−x,z−y)得 gcd(a1+k,a2+k,a3+k-,an+k)=gcd(a1 ...

  6. 牛客挑战赛47 D Lots of Edges(最短路+递归枚举子集)

    牛客挑战赛47 D Lots of Edges 思路:点的权值最多只有(1<<17)-1(131071) ,那我们可以枚举终点的值来算最短路,每个点能连边的值都是固定的,可以通过递归枚举子 ...

  7. 牛客网Java刷题知识点之关键字static、static成员变量、static成员方法、static代码块和static内部类...

    不多说,直接上干货! 牛客网Java刷题知识点之关键字static static代表着什么 在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个"伪全局"的概 ...

  8. 牛客网Java刷题知识点之构造函数可以调用一般函数,但是一般函数不可以直接调用构造函数...

    不多说,直接上干货! 通过 牛客网Java刷题知识点之构造函数是什么.一般函数和构造函数什么区别呢.构造函数的重载.构造函数的内存图解 我们对构造函数有了一个比较清楚的认识,当我们在创建对象时,我们会 ...

  9. 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合...

    不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...

  10. 牛客网Veirlog刷题答案目录(持续更新)

    牛客网Veirlog刷题答案目录(持续更新) 基础篇 进阶篇 基础篇 1.VL1--四选一多路选择器 2.VL2--异步复位的串联T触发器 3.VL3--奇偶校验 4.VL4--移位运算与乘法 5.V ...

最新文章

  1. 技术图文:双指针在求解算法题中的应用
  2. 2021年信号与系统作业统计处理
  3. 模式识别之车牌识别---一个开源车牌识别项目easypr
  4. 判断是否是ie浏览器 前端js_JS判断是否是IE浏览器
  5. 自然语言12_Tokenizing Words and Sentences with NLTK
  6. HDU - 4027 Can you answer these queries?(线段树)
  7. 8.2 css3 新增标签 盒子模型 长度单位 颜色 渐变 径像渐变
  8. C++学习 高级编程
  9. Python之OS模块进程管理介绍--os.fork()
  10. java redis rpush_Redis Rpush 命令
  11. 在 Vs2013中查看类的内部布局
  12. VUE页面中加载外部HTML
  13. 虚拟机上用U盘安装系统
  14. 编译安装libmodbus库
  15. 中国五笔 恶意软件清理助手
  16. Unity-之-物体旋转-跳跃-2021.5.13
  17. 自定义Drawable实现灵动的红鲤鱼动画(下篇)
  18. OpenCV学习17_ 分水岭算法
  19. 形态世界的非定形现象
  20. 送书 | 一位60后老程序员从零学习Python的感悟

热门文章

  1. 计算机视觉方向简介 | 手机产品条码检测方案
  2. 如何消除摄影中的运动模糊?
  3. 使用OpenCV进行对象检测
  4. 【OpenCV 4开发详解】分割图像——Grabcut图像分割
  5. Virtual Box+Centos7.0+Kaldi安装
  6. MarkdownPad2.5 注册码
  7. Java开发者必读的10篇精选优秀技术文章
  8. 第十节 范围操作符(Range Operators)
  9. PARAMETER FILE研究
  10. python画小猪佩奇