题目链接:点击查看

题目大意:给出一棵有根树,根节点为点 1 ,每个节点都有一个权值 val 和两个属性 b , c ,属性 b 和 c 的权值非 0 即 1 ,现在可以进行的操作是,选择一个节点 x ,再从子树中任选 k 个结点,将这 k 个结点的属性 b 重新分配,代价为 val[ x ] * k ,问让所有节点的属性 b 都等于属性 c 的最小花费是多少

题目分析:拖了三天的题解,这两天被比赛,期末答辩还有数模测试折磨的不成人样了,终于有时间再来做做题目,写写博客放松一下了

首先对于这棵树,自上而下维护一下点权的最小值,因为节点 fa 是节点 u 的祖先,如果 val[ u ] > val[ fa ] ,因为 u 的子树也肯定是 fa 的子树,那么显然在 fa 选择原本打算在 u 需要选择的 k 个结点更优,所以不妨直接将 val 维护为祖先的最小值

这样自底向上统计子树中有多少个 0 需要变成 1 ,记为 c0 ,同理统计 c1 为有多少个 1 需要变成 0 ,然后贪心交换就好了

注意特判一下,如果 b 和 c 中 0 1 的数量不相等,直接输出 -1 即可

因为 pair 不支持加法,所以我自己写了一个结构体代替 pair,并且重载了加法和减法,还是比较方便的

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=2e5+100;struct Node
{int a,b;Node(){a=b=0;}Node(int a,int b):a(a),b(b){}Node operator+(const Node& t)const{return Node(a+t.a,b+t.b);}Node operator-(int val)const{return Node(a-val,b-val);}int get_min(){return min(a,b);}
};int a[N],b[N],c[N];vector<int>node[N];LL ans=0;Node dfs(int u,int fa)
{Node temp;if(b[u]!=c[u]){if(b[u]==1)temp.a++;elsetemp.b++;}for(auto v:node[u]){if(v==fa)continue;a[v]=min(a[v],a[u]);temp=temp+dfs(v,u);}int mmin=temp.get_min();temp=temp-mmin;ans+=2LL*mmin*a[u];return temp;
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("input.txt","r",stdin);
//  freopen("output.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int n,c0=0;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d%d%d",a+i,b+i,c+i);c0+=(b[i]==0)-(c[i]==0);}for(int i=1;i<n;i++){int u,v;scanf("%d%d",&u,&v);node[u].push_back(v);node[v].push_back(u);}if(c0)return 0*puts("-1");dfs(1,-1);printf("%lld\n",ans);return 0;
}

CodeForces - 1363E Tree Shuffling(树上贪心)相关推荐

  1. Codeforces Round #665 (Div. 2) Maximum Distributed Tree(树上贪心)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 CF1401D Maximum Distributed Tree(树上贪心) 给定一棵 nnn 个节点 ...

  2. CodeForces - 570D Tree Requests(树上启发式合并)

    题目链接:点击查看 题目大意:给定一个以1为根的n个节点的树,每个点上有一个字母(a−z),每个点的深度定义为该节点到1号节点路径上的点数,每次询问a,b查询以a为根的子树内深度为b的节点上的字母重新 ...

  3. Codeforces Round #417:E. FountainsSagheer and Apple Tree(树上博弈)

    Codeforces Round #417:E. FountainsSagheer and Apple Tree(树上博弈) 标签: codeforces 2017-06-02 11:41 29人阅读 ...

  4. codeforces Gym 100338E Numbers (贪心,实现)

    题目:http://codeforces.com/gym/100338/attachments 贪心,每次枚举10的i次幂,除k后取余数r在用k-r补在10的幂上作为候选答案. #include< ...

  5. HDU - 5242 Game(树形dp+树链剖分/树上贪心+思维)

    题目链接:点击查看 题目大意:给出一棵包含n个节点的树,每个节点都有一个权值,整棵树的根是点1,问从点1开始向下一直走到叶子节点,可以走k次,怎么样走权值和最大,每个节点被走过一次后权值会变为0 题目 ...

  6. CodeForces - 965E Short Code (字典树上贪心)

    题目链接:点击查看 题目大意:给出n个互不相同的字符串,现在要求n个互不相同的前缀,问所有前缀的长度和最短是多少 题目分析:因为涉及到了前缀,所以我们可以用字典树来解决,又因为需要长度和最短,所以我们 ...

  7. Codeforces Round #646 (Div. 2)E. Tree Shuffling 题解(dfs)

    题目链接 题目大意 给你一颗树,每一个节点有一个a[i],b[i],c[i]值,你要把b[i]变成c[i],b[i]和c[i]为[0,1],你操作的方法是,选择一个节点x,选择他的k个子树,然后进行交 ...

  8. 【codeforces round#800 D题 Fake Plastic Trees】树上贪心

    题目链接 题意: 给你一棵树,树上有n个节点,树的根节点是1,一开始树上的每个节点的权值都是0,现在有一种操作,选择一个节点,使得根节点到这个节点的路径上的所有节点的权值都增加,增加的幅度从根节点到这 ...

  9. CodeForces - 375D Tree and Queries(树上启发式合并)

    题目链接:点击查看 题目大意:给出一棵有根树,每个节点都有一个编号代表颜色,现在给出m个询问,每个询问的形式为u k,需要回答以u为根节点的子树中,数量超过k的颜色有多少种 题目分析:树上启发式合并模 ...

最新文章

  1. php pdo 预处理删除,PHP PDO扩展整理,包括环境配置\基本增删改查\事务\预处理
  2. UC 国际信息流推荐中的多语言内容理解
  3. CSS:CSS定位和浮动
  4. windows系统bat批处理 bat脚本默认拥有管理员权限
  5. c语言兔子序列答案,C语言经典题目——兔子生兔子(示例代码)
  6. TimeBake:part1
  7. java 获取系统默认打印机状态
  8. 数据库课程设计——学生宿舍信息管理系统
  9. 微信小程序开发手册 - 02JSON 配置
  10. 新手小白入门编程第3讲 JAVA入门案例
  11. 【go-zero】go-zero 敏感词过滤 整合 开源过滤敏感词插件 sensitive
  12. 如何写简单的linux脚本
  13. 基于PHP+小程序(MINA框架)+Mysql数据库的篮球、足球、羽毛球等校园运动场地预约小程序系统设计与实现
  14. 计算机怎么换背景图片,电脑开机背景图怎么换_怎么设置开机背景的教程
  15. 整理:C primer plus 学习笔记
  16. 3D图形:矩阵的相关知识
  17. 《黄帝内经》的养生之道
  18. Greenplum数据库中master节点恢复
  19. UML 构件图(组件图)
  20. shell comand

热门文章

  1. MySQL常见的主从复制架构_如何搭建经典的MySQL 主从复制架构
  2. linux mysql UNSIGNED,关于mysql:MySqlint10-与-int-unsigned-之前的区别
  3. java如何解决高并发问题_java怎么处理高并发?
  4. MySQL高级 大批量插入数据
  5. Nacos处理服务变更通知
  6. Survivor区详解
  7. Servlet 请求处理
  8. RPC实现Consumer 远程调用
  9. Java动态代理生成的对象导出方法
  10. RocketMQ各种集群模式介绍