Codeforces Round #646 (Div. 2) E. Tree Shuffling dfs
题意:
给你n个节点,这n个节点构成了一颗以1为树根的树。每一个节点有一个初始值bi,从任意节点 i 的子树中选择任意k个节点,并按他的意愿随机排列这些节点中的数字,从而产生k⋅ai 的成本。对于一个节点i你需要将bi改成ci。
这个bi值和ci值的范围是[0,1]
题解:
对于一个节点,如果它的bi==ci,那么我们就不用管它(因为你改变它的值,那么肯定之后还要花费成本再改回来,增加了成本)。那么我们首先找出来一共有多少个节点bi!=ci ,然后总权值肯定是
num1*a1+num2*a2...+numn*an
numi表示从节点 i 的子树中选择任意numi个节点
那么肯定是尽可能在ai的值越小的子树上尽量增加numi的数量,这样总权值肯定最小
cnt0[i]:以i节点为树根的子树,在bi!=ci,bi等于0的数量
cnt1[i]:以i节点为树根的子树,在bi!=ci,bi等于1的数量
那么我们就从树根开始dfs,并且维护一个ai最小值,在dfs过程中记录一下i这个节点的所有子节点上bi!=ci的数量(如果bi!=ci,还要记录一下i这个点的bi值),如果ai等于我们维护的那个ai最小值,那就对这个节点
的2*min(cnt0[i],cnt1[i])个节点进行排序。然后让cnt1[i]和cnt0[i]都减去min(cnt0[i],cnt1[i])
最后判断一下cnt1[1]和cnt0[1]是否为0,等于0就代表所有节点bi都等于ci,否则输出-1
代码:
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string>
#include<queue>
#include<deque>
#include<string.h>
#include<map>
#include <iostream>
#include <math.h>
#define Mem(a,b) memset(a,b,sizeof(a))
const double II = acos(-1);
const double PP = (II*1.0)/(180.00);
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int maxn=2e5+10;
ll a[maxn],b[maxn],c[maxn],cnt0[maxn],cnt1[maxn],sum;
vector<ll>w[maxn];
void dfs(ll x,ll fa,ll minn)
{
minn=min(minn,a[x]);
for(ll i=0;i<w[x].size();++i)
{
ll now=w[x][i];
if(now!=fa)
{
dfs(now,x,minn);
cnt0[x]+=cnt0[now];
cnt1[x]+=cnt1[now];
}
}
if(b[x]!=c[x])
{
if(b[x])
cnt1[x]++;
else cnt0[x]++;
}
if(minn==a[x])
{
ll ans=min(cnt0[x],cnt1[x]);
ans*=2;
//printf("%d %d****\n",ans,a[x]);
sum=sum+ans*a[x];
ans/=2;
cnt0[x]-=ans;
cnt1[x]-=ans;
}
}
int main()
{
ll n;
sum=0;
scanf("%I64d",&n);
for(ll i=1;i<=n;++i)
{
scanf("%I64d%I64d%I64d",&a[i],&b[i],&c[i]);
}
for(ll i=1;i<n;++i)
{
ll u,v;
scanf("%I64d%I64d",&u,&v);
w[u].push_back(v);
w[v].push_back(u);
}
dfs(1,0,INF);
if(cnt1[1] || cnt0[1])
{
printf("-1\n");
}
else printf("%I64d\n",sum);
}
Codeforces Round #646 (Div. 2) E. Tree Shuffling dfs的更多相关文章
- Codeforces Round #646 (Div. 2) E. Tree Shuffling(树上dp)
题目链接:https://codeforces.com/contest/1363/problem/E 题意 有一棵 $n$ 个结点,根为结点 $1$ 的树,每个结点有一个选取代价 $a_i$,当前 $ ...
- Codeforces Round #316 (Div. 2) D. Tree Requests dfs序
D. Tree Requests time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- Codeforces Round #499 (Div. 1) F. Tree
Codeforces Round #499 (Div. 1) F. Tree 题目链接 \(\rm CodeForces\):https://codeforces.com/contest/1010/p ...
- Codeforces Round #646 (Div. 2) 题解 (ABCDE)
目录 A. Odd Selection B. Subsequence Hate C. Game On Leaves D. Guess The Maximums E. Tree Shuffling ht ...
- Codeforces Round #353 (Div. 2) D. Tree Construction 二叉搜索树
题目链接: http://codeforces.com/contest/675/problem/D 题意: 给你一系列点,叫你构造二叉搜索树,并且按输入顺序输出除根节点以外的所有节点的父亲. 题解: ...
- Codeforces Round #540 (Div. 3)--1118F1 - Tree Cutting (Easy Version)
https://codeforces.com/contest/1118/problem/F1 #include<bits/stdc++.h> using namespace std; in ...
- Codeforces Round #353 (Div. 2) D. Tree Construction 模拟
D. Tree Construction 题目连接: http://www.codeforces.com/contest/675/problem/D Description During the pr ...
- Codeforces Round #540 (Div. 3) F1. Tree Cutting (Easy Version) 【DFS】
任意门:http://codeforces.com/contest/1118/problem/F1 F1. Tree Cutting (Easy Version) time limit per tes ...
- Codeforces Round #527 (Div. 3) F. Tree with Maximum Cost 【DFS换根 || 树形dp】
传送门:http://codeforces.com/contest/1092/problem/F F. Tree with Maximum Cost time limit per test 2 sec ...
随机推荐
- 深入理解nodejs中的异步编程
目录 简介 同步异步和阻塞非阻塞 javascript中的回调 回调函数的错误处理 回调地狱 ES6中的Promise 什么是Promise Promise的特点 Promise的优点 Promise ...
- 【MySQL】MySQL知识图谱
MySQL 文章目录 MySQL 表 锁 索引 连接管理 事务 日志系统 简单记录 极客时间 - MySQL实战45讲 MySQL知识图谱 表 表 引擎选择 编码问题 表空间管理 字段设计 备份和恢复 ...
- C#中foreach的实现原理
C#中foreach的实现原理 在探讨foreach如何内部如何实现这个问题之前,我们需要理解两个C#里边的接口,IEnumerable 与 IEnumerator. 在C#里边的遍历集合时用到的相关 ...
- kubectl工具管理应用
kubectl工具管理应用 创建一个pod [root@k8s-master ~]# kubectl run nginx --replicas=3 --labels="app=nginx-e ...
- kioptrixVM3
简介 Vulnhub是一个提供各种漏洞环境的靶场平台. 个人学习目的:1,方便学习更多类型漏洞.2,为OSCP做打基础. 下载链接 https://www.vulnhub.com/entry/kiop ...
- STM32F207时钟系统解析
在前几天的文章<晶振原理解析>中介绍了晶振如何产生时钟的,板子使用的是25M无源晶振,下文将介绍STM32F207的时钟系统如何将25M晶振时钟转换为120M系统主频时钟的. 01.时钟系 ...
- JD6621快速充电协议芯片,带有PPS 控制器的USB-PD3.0
描述 JD6621是高度集成的USB供电(PD)控制器,支持USB PD 3.0 ,该USB PD 3.0 具有针对USBType-C下游接口(源)设计的可编程电源(PPS)规范.它监视CC引脚以检测 ...
- Flask源码关于local的实现
flask源码关于local的实现 try: # 协程 from greenlet import getcurrent as get_ident except ImportError: try: fr ...
- 研发过程及工具支撑 DevOps 工具链集成
https://mp.weixin.qq.com/s/NYm63nkCymIV3DbL4O01dg 腾讯重新定义敏捷 |Q推荐 小智 InfoQ 2020-09-03 敏捷开发奠基人 Robert C ...
- 服务之间的调用为啥不直接用 HTTP 而用 RPC?
什么是 RPC?RPC原理是什么? 什么是 RPC? RPC(Remote Procedure Call)-远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.比 ...