题目

题意简述

  link.

  给一棵 \(n\) 个结点的有根树,点带权。把点分为若干组,并要求同组内不存在任何祖先-后代关系。最小化每组内的最大点权之和。

数据规模

  \(n\le2\times10^5\)。

Solution

  考虑一个部分分——链。

  当根节点 \(1\) 不是链头,相当于 \(1\) 左右两条链分组,\(1\) 单独一组。而显然,答案是若干点权的和。所以我们只需要贪心地让较大点权与最大点权成为一组来减小答案。

  所以可以用堆——把 \(1\) 左右的点权存入两个堆,每次取出两个堆的最大值构成一组。当一个堆空,另一个堆每个元素构成一组,\(1\) 单独构成一组。

  把这个做法搬到树上——每个结点维护一个堆,堆内存放子树内每个分组的最大值。在当前子树根结点启发式合并每个儿子的堆,并按上述做法贪心地分组计算答案。最后记得将当前子树根的权加入堆。

代码

#include <queue>
#include <cstdio>
#include <vector> typedef long long LL; inline int rint () {
int x = 0, f = 1; char s = getchar ();
for ( ; s < '0' || '9' < s; s = getchar () ) f = s == '-' ? -f : f;
for ( ; '0' <= s && s <= '9'; s = getchar () ) x = x * 10 + ( s ^ '0' );
return x * f;
} template<typename Tp>
inline void wint ( Tp x ) {
if ( x < 0 ) putchar ( '-' ), x = ~ x + 1;
if ( 9 < x ) wint ( x / 10 );
putchar ( x % 10 ^ '0' );
} const int MAXN = 2e5;
int n, ecnt, mem[MAXN + 5], head[MAXN + 5], hid[MAXN + 5];
std :: vector<LL> tmp;
std :: priority_queue<LL> heap[MAXN + 5]; struct Edge { int to, nxt; } graph[MAXN + 5]; inline void link ( const int s, const int t ) { graph[++ ecnt] = { t, head[s] }, head[s] = ecnt; } inline void DFS ( const int u ) {
for ( int i = head[hid[u] = u], v; i; i = graph[i].nxt ) {
DFS ( v = graph[i].to );
if ( heap[hid[u]].size () < heap[hid[v]].size () ) hid[u] ^= hid[v] ^= hid[u] ^= hid[v];
for ( ; ! heap[hid[v]].empty (); heap[hid[u]].pop (), heap[hid[v]].pop () ) {
tmp.push_back ( std :: max ( heap[hid[u]].top (), heap[hid[v]].top () ) );
}
for ( ; ! tmp.empty (); tmp.pop_back () ) heap[hid[u]].push ( tmp[tmp.size () - 1] );
}
heap[hid[u]].push ( mem[u] );
} int main () {
n = rint ();
for ( int i = 1; i <= n; ++ i ) mem[i] = rint ();
for ( int i = 2; i <= n; ++ i ) link ( rint (), i );
DFS ( 1 ); LL ans = 0;
for ( ; ! heap[hid[1]].empty (); heap[hid[1]].pop () ) ans += heap[hid[1]].top ();
wint ( ans ), putchar ( '\n' );
return 0;
}

Solution -「十二省联考2019」春节十二响的更多相关文章

  1. 「洛谷5290」「LOJ3052」「十二省联考 2019」春节十二响【启发式合并】

    题目链接 [洛谷传送门] [LOJ传送门] 题目大意 给定一棵树,每次选取树上的一个点集,要求点集中的每个点不能是另一个点的祖先,选出点集的代价为点集中权值最大点的权值,问将所有点都选一遍的最小代价为 ...

  2. LOJ#3052. 「十二省联考 2019」春节十二响(启发式合并)

    题面 传送门 题解 先考虑一条链的情况,对于\(1\)号点来说,肯定是左子树中最大值和右子树中最大值一组,左子树中次大值和右子树中次大值一组--以此类推 那么如果不是一条链呢?我们把所有的链合并起来就 ...

  3. [十二省联考2019]D2T2春节十二响

    嘟嘟嘟 这题真没想到这么简单-- 首先有60分大礼:\(O(n ^ 2logn)\)贪心.(我也不知道为啥就是对的) 然后又送15分链:维护两个堆,每次去堆顶的最大值. 这时候得到75分已经很开心了, ...

  4. 「ZJOI2019」&「十二省联考 2019」题解索引

    「ZJOI2019」&「十二省联考 2019」题解索引 「ZJOI2019」 「ZJOI2019」线段树 「ZJOI2019」Minimax 搜索 「十二省联考 2019」 「十二省联考 20 ...

  5. LOJ #3049. 「十二省联考 2019」字符串问题

    LOJ #3049. 「十二省联考 2019」字符串问题 https://loj.ac/problem/3049 题意:给你\(na\)个\(A\)类串,\(nb\)个\(B\)类串,\(m\)组支配 ...

  6. 【LOJ】#3051. 「十二省联考 2019」皮配

    LOJ#3051. 「十二省联考 2019」皮配 当时我在考场上觉得这题很不可做... 当然,出了考场后再做,我还是没发现学校和城市是可以分开的,导致我还是不会 事实上,若一个城市投靠了某个阵营,学校 ...

  7. 「十二省联考 2019」皮配——dp

    题目 [题目描述] #### 题目背景一年一度的综艺节目<中国好码农>又开始了.本季度,好码农由 Yazid.Zayid.小 R.大 R 四位梦想导师坐镇,他们都将组建自己的梦想战队,并率 ...

  8. 「十二省联考 2019」字符串问题——SAM+DAG

    题目 [题目描述] Yazid 和 Tiffany 喜欢字符串问题.在这里,我们将给你介绍一些关于字符串的基本概念. 对于一个字符串 $S$, 我们定义 $\lvert S\rvert$ 表示 $S$ ...

  9. 题解 loj3050 「十二省联考 2019」骗分过样例

    CASE \(1\sim 3\) \(n\)组测试数据,每次输入一个数\(x\),求\(19^x\). 测试点\(1\),\(x=0,1,\dots n-1\),可以直接递推. 测试点\(2\)要开l ...

随机推荐

  1. 【填坑往事】使用Rxjava2的distinct操作符处理自定义数据类型去重的问题

    最近碰到一个问题,自定义数据类型列表中出现了重复数据,需要去重.处理去重的办法很多,比如借助Set集合类,使用双重循环拿每一个元素和其他元素对比等.这里介绍一种简单而且比较优雅的方式:使用Rxjava ...

  2. 利用Word2010制作流程图

    利用Word2010制作流程图 原文链接:https://www.toutiao.com/i6483034968225235469/ 一.页面和段落的设置 启动Word2010,打开一个空白文档,并切 ...

  3. 日K蜡烛图

    股票价格涨跌趋势,常用蜡烛图技术中的K线图来表示,分为按日的日K线.按周的周K线.按月的月K线等.以日K线为例,每天股票价格从开盘到收盘走完一天,对应一根蜡烛小图,要表示四个价格:开盘价格Open(早 ...

  4. Python函数与lambda 表达式(匿名函数)

    Python函数 一.函数的作用 函数是组织好的,可重复使用的,用来实现单一或相关联功能的代码段 函数能提高应用的模块性和代码的重复利用率 python 内置函数:https://docs.pytho ...

  5. Pyomo+GLPK使用

    Pyomo下载安装 GLPK的下载和安装参考上一篇博客. mkdir Pyomo cd Pyomo wget https://github.com/Pyomo/pyomo/archive/5.6.6. ...

  6. 根据happens-before法则借助同步

    在文章的开始,我们先来看一段代码以及他的执行情况: public class PossibleRecording{ static int x = 0, y = 0; static int a = 0, ...

  7. unity3d,java,c#,python,rospy的socket通信测试

    1.C#在与其他人通信时,最好不要用tcpclient来承接其他语言,会收不到用户名,最好都用socket. 2.unity3d在与java通信时,对方返回我unity3d发的数据流会打印收到一个类, ...

  8. pytest文档2-用例执行

    用例设计原则 1.文件名以test_******.py文件和*******_test.py 2.以test_****开头的函数 3.以Test***开头的类 4.以test_*****开头的方法 5. ...

  9. QT之键盘事件

    Widget.h: #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include<QKeyEvent> #incl ...

  10. 前端基础之javaScript(基本类型-布尔值数组-if-while)

    目录 一:javaScript基本数据类型 1.字符串类型常用方法 2.返回长度 3.移出空白 4.移除左边的空白 5.移出右边的空格 6.返回第n个字符 7.子序列位置 8.根据索引获取子序列 9. ...