【牛客挑战赛】我是 A 题
题目还是有点坑的,我一开始以为删掉一些边,点也没了,不知道我是为什么会这么想…
其实这道题的意思是,给你一个树,让你删掉一些边,使得由树删掉边剩余的多个连通块每个连通块的权值和是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 题相关推荐
- 牛客网Java刷题知识点之ArrayList 、LinkedList 、Vector 的底层实现和区别
不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...
- 牛客挑战赛42 A.小睿睿的数列
牛客挑战赛42 A.小睿睿的数列 题目链接 题目描述 小睿睿给了你一个长度为n的数列,他想问你该数列中满足条件(区间内存在某个数是区间内所有数的公因数)的最长区间有多少个 输入描述: 第一行 111 ...
- 【百日冲大厂】第十篇,牛客网选择题+编程题井字棋+密码强度等级
前言: 大家好,我是良辰丫,刷题的第十篇,牛客网选择题+编程题井字棋+密码强度等级.
- 牛客挑战赛47 C 条件(Floyd bitset优化)
牛客挑战赛47 C 条件 思路:首先我们要两个图,一个是一定能到达的,一个是可能到达的,如果我们使用floyd (n^3)就有可能会超时,因为只要求询问能否到达,所以权值只有0和1,那我们可以使用bi ...
- 牛客挑战赛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 ...
- 牛客挑战赛47 D Lots of Edges(最短路+递归枚举子集)
牛客挑战赛47 D Lots of Edges 思路:点的权值最多只有(1<<17)-1(131071) ,那我们可以枚举终点的值来算最短路,每个点能连边的值都是固定的,可以通过递归枚举子 ...
- 牛客网Java刷题知识点之关键字static、static成员变量、static成员方法、static代码块和static内部类...
不多说,直接上干货! 牛客网Java刷题知识点之关键字static static代表着什么 在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个"伪全局"的概 ...
- 牛客网Java刷题知识点之构造函数可以调用一般函数,但是一般函数不可以直接调用构造函数...
不多说,直接上干货! 通过 牛客网Java刷题知识点之构造函数是什么.一般函数和构造函数什么区别呢.构造函数的重载.构造函数的内存图解 我们对构造函数有了一个比较清楚的认识,当我们在创建对象时,我们会 ...
- 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合...
不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...
- 牛客网Veirlog刷题答案目录(持续更新)
牛客网Veirlog刷题答案目录(持续更新) 基础篇 进阶篇 基础篇 1.VL1--四选一多路选择器 2.VL2--异步复位的串联T触发器 3.VL3--奇偶校验 4.VL4--移位运算与乘法 5.V ...
最新文章
- 技术图文:双指针在求解算法题中的应用
- 2021年信号与系统作业统计处理
- 模式识别之车牌识别---一个开源车牌识别项目easypr
- 判断是否是ie浏览器 前端js_JS判断是否是IE浏览器
- 自然语言12_Tokenizing Words and Sentences with NLTK
- HDU - 4027 Can you answer these queries?(线段树)
- 8.2 css3 新增标签 盒子模型 长度单位 颜色 渐变 径像渐变
- C++学习 高级编程
- Python之OS模块进程管理介绍--os.fork()
- java redis rpush_Redis Rpush 命令
- 在 Vs2013中查看类的内部布局
- VUE页面中加载外部HTML
- 虚拟机上用U盘安装系统
- 编译安装libmodbus库
- 中国五笔 恶意软件清理助手
- Unity-之-物体旋转-跳跃-2021.5.13
- 自定义Drawable实现灵动的红鲤鱼动画(下篇)
- OpenCV学习17_ 分水岭算法
- 形态世界的非定形现象
- 送书 | 一位60后老程序员从零学习Python的感悟