P5290 [十二省联考2019]春节十二响
传送门
考虑一个子树里是怎么划分的,维护划分出来的每个集合的最大值,这个可以用一个 $multiset$ 维护
设 $S[x]$ 表示节点 $x$ 的子树中,最优划分 划分出来的每个块的节点最大值
首先叶子节点的集合显然只有它本身
然后考虑子树之间的合并,设两个子树根节点为 $x,y$,因为两个子树之间一定不会有祖先后代关系
贪心地想,显然 $S[x]$ 的最大值优先跟 $S[y]$ 的最大值合并(取 $max$),然后次大值跟次大值合并...这样一路合并下去是最优的
所以直接启发式合并就好了
$x$ 的子树合并完后还要考虑当前节点 $x$ 也加入进来,显然此节点只能单独分一个块出来
一开始以为复杂度 $O(nlog^2_n)$(启发式合并 $nlog_n$,$multiset$ 单次操作 $log_n$)
但是经过对代码的分析可以发现,这并不是直接合并,而是小的 $S$ 和大的取一个最大值后就没了,并没有增加大的集合的集合大小
所以每个节点只会算一次,复杂度 $O(nlog_n)$
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<set> using namespace std; typedef long long ll; inline int read() {int x=0; char ch=getchar();while(ch<'0'||ch>'9') ch=getchar();while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }return x; } const int N=4e5+7; int fir[N],from[N<<1],to[N<<1],cntt; inline void add(int a,int b) {from[++cntt]=fir[a]; fir[a]=cntt;to[cntt]=b; } int n,val[N]; multiset <int> S[N]; multiset <int>::iterator it,pit,itt; inline void merge(int x,int y)//很多细节的启发式合并操作 {if(S[x].size()<S[y].size()) swap(S[x],S[y]);//启发式合并if(!S[y].size()) return;//记得特判,不然后面it--时会直接GGpit=S[x].end(); pit--; bool flag=1;it=S[y].end(); it--;while(it!=S[y].begin()){pit--; itt=pit; pit++;//注意要先用itt存一下pit-1的指针等等erase(pit)后pit就是指向不合法地址的指针了,那时再pit--就GG了if((*it)>(*pit)) S[x].erase(pit),S[x].insert(*it);it--; pit=itt;}if((*it)>(*pit)) S[x].erase(pit),S[x].insert(*it);//注意最后S[y].begin()的值还没合并 } void dfs(int x) {for(int i=fir[x];i;i=from[i])dfs(to[i]),merge(x,to[i]);S[x].insert(val[x]); } int main() {n=read(); int a;for(int i=1;i<=n;i++) val[i]=read();for(int i=2;i<=n;i++)a=read(),add(a,i);dfs(1);ll ans=0;for(it=S[1].begin();it!=S[1].end();it++) ans+=(*it);printf("%lld",ans);return 0; }
转载于:https://www.cnblogs.com/LLTYYC/p/10682961.html
P5290 [十二省联考2019]春节十二响相关推荐
- [十二省联考2019]春节十二响——长链剖分+堆
题目链接: [十二省联考2019]春节十二响 可以发现每条链上的所有点都要放在不同的段里,那么最多只需要树的深度这么多段就够了. 因为这样可以保证每条链上的点可以放在不同的段中而且一个点放在这些段中一 ...
- P5290-[十二省联考2019]春节十二响【贪心,堆】
正题 题目链接:https://www.luogu.org/problemnew/show/P5290 题目大意 将一棵树的所有节点分城若干个组.每个组的价格是这个组中价格最大的点,要求这个组中没有任 ...
- 【十二省联考】春节十二响【贪心】【堆】【启发式合并】
传送门 题意:给一棵nnn个点带点权的树,要求把点分成若干部分,有祖孙关系的点不能在同一部分.求每个部分最大值 的和 的最小值. n≤2×105n \leq 2\times 10^5n≤2×105 由 ...
- 十二省联考 2019 题解
[十二省联考2019]异或粽子 首先异或转前缀和,类似超级钢琴,将三元组 ( l , r , p ) (l,r,p) (l,r,p) 插入堆,表示 s u m [ p ] sum[p] sum[p] ...
- 【BZOJ5498】[十二省联考2019]皮配(动态规划)
[BZOJ5498][十二省联考2019]皮配(动态规划) 题面 BZOJ 洛谷 题解 先考虑暴力\(dp\),设\(f[i][j][k]\)表示前\(i\)所学校,有\(j\)人在某个阵营,有\(k ...
- 【十二省联考2019】春节十二响
题面 https://www.luogu.org/problem/P5290 题解 真的是我傻逼,十二省联考$day2$至今还是我的噩梦.$day1$起码一直在调可持久化$trie$树,$day2$真 ...
- 「十二省联考 2019」皮配——dp
题目 [题目描述] #### 题目背景 一年一度的综艺节目<中国好码农>又开始了.本季度,好码农由 Yazid.Zayid.小 R.大 R 四位梦想导师坐镇,他们都将组建自己的梦想战队,并 ...
- HAOI(十二省联考)2019 qwq记
\(\large{Day\ -1}:\) 放假了,白天大概是抱着最后一次在机房的心态复习着板子过去的.看着机房里的各位神仙丝毫不慌的颓倒是有点慌了,敲了一下多项式的板子感觉写的相当自闭,感觉AFO应该 ...
- 十二省联考2019酱油记
在中考前去省选玩一趟. Day -1 对于一个还没有学会所有省选内容的初三Oier来说,这一趟真的是去打酱油的啊.但还是要认真复习. 最近几天在字符串的路上越走越远-晚上才开始复习图论.还有一大堆没有 ...
最新文章
- Java项目:健身器材商城系统(java+Jdbc+Servlet+Ajax+Fileupload+mysql)
- KOFLive Beta 下载情况及用户反馈
- 如何利用 Arthas 热更新线上代码
- C#通过FFmpeg获得视频文件参数
- ASP.NET AJAX深入浅出系列课程(10):基于Microsoft AJAX Library扩展客户端组件.zip(10.77 MB)...
- offset函数的高级用法_数据验证(数据有效性)结合Offset函数 的综合用法
- php7 findandmodify,node.js – (mongoose / promises)如何检查文档是否是使用带有upsert的findOneAndUpdate创建的...
- 未能打开组策略对象 您可能没有合适的权限
- ev4加密视频转换成MP4格式
- Ubuntu 更改默认浏览器
- mac上彻底删除 搜狗输入法 鼠须管输入法
- jsp 页面进行debug 断点找错误
- 最新 python自动化高频面试题及答案
- 老子是一个怎样的传奇!(转发)
- Mina的zkApp
- 列举组合的所有情况(多层嵌套for循环与递归)
- 关于序列化不成功的bug处理
- ZOJ 3964Yet Another Game of Stones 扩展尼姆博弈
- numpy中的插值函数interp
- html怎么设置凹陷效果,如何在css中实现圆角内凹效果
热门文章
- Javascript简介
- Python 类继承,__bases__, __mro__, super
- DOS常用网络相关命令
- Table options do not contain an option key ‘connector‘ for discovering a connector
- 中文分词工具jieba中的词性类型(转载)
- 淘宝上的所有cuda书籍调研
- DataFrame挑选其中两列,带列名
- 操作系统 哈工大 李治军
- OpenGL:使用FBO为渲染对象并从GPU取出存图
- GStreamer(一)