题解 BZOJ4919 【大根堆】
题面:传送门。
老师说今天要考一道线段树合并,然后。。。然后这道题我就GG了。(当然可以用线段树合并写,只是比较复杂)
有人赛时想了个贪心,然后被机房巨佬hack了,结果在hack的过程中巨佬想出了正解。。。
贪心思路:
对于一个节点,取右边的(大一点的)肯定更优。
(其实很好hack啊,随便搞一条链就可以了)
AC思路:
对于每个节点,像LIS那样找子节点中大于它的最小的,然后替换掉,这样肯定是最优的。
于是这道题可以看做拓展到树上的LIS,
于是我们每个节点搞一个set,然后一路往上启发式合并就可以了。
1 #include <iostream>
2 #include <cstdio>
3 #include <set>
4
5 using namespace std;
6
7 namespace StandardIO {
8
9 template<typename T>inline void read (T &x) {
10 x=0;T f=1;char c=getchar();
11 for (; c<'0'||c>'9'; c=getchar()) if (c=='-') f=-1;
12 for (; c>='0'&&c<='9'; c=getchar()) x=x*10+c-'0';
13 x*=f;
14 }
15
16 template<typename T>inline void write (T x) {
17 if (x<0) putchar('-'),x*=-1;
18 if (x>=10) write(x/10);
19 putchar(x%10+'0');
20 }
21
22 }
23
24 using namespace StandardIO;
25
26 namespace Solve {
27
28 const unsigned int N=200001;
29
30 unsigned int n;
31 unsigned int val[N];
32 unsigned int cnt;
33 unsigned int head[N];
34 struct node {
35 unsigned int to,next;
36 } edge[N<<1];
37 multiset<unsigned int> s[N];
38
39 inline void add (unsigned int a,unsigned int b) {
40 edge[++cnt].to=b,edge[cnt].next=head[a],head[a]=cnt;
41 }
42 inline void merge (unsigned int u,unsigned int v) {
43 if (s[u].size()<s[v].size()) {
44 swap(s[u],s[v]);
45 }
46 for (register multiset<unsigned int>::iterator i=s[v].begin(); i!=s[v].end(); ++i) {
47 s[u].insert(*i);
48 }
49 s[v].clear();
50 }
51 void dfs (unsigned int now) {
52 for (register int i=head[now]; i; i=edge[i].next) {
53 dfs(edge[i].to);
54 merge(now,edge[i].to);
55 }
56 multiset<unsigned int>::iterator place=s[now].lower_bound(val[now]);
57 if (place!=s[now].end()) s[now].erase(place);
58 s[now].insert(val[now]);
59 }
60
61 inline void solve() {
62 read(n);
63 for (register unsigned int i=1; i<=n; ++i) {
64 unsigned int tmp;
65 read(val[i]),read(tmp);
66 if (tmp) add(tmp,i);
67 }
68 dfs(1);
69 write(s[1].size());
70 }
71
72 }
73
74 using namespace Solve;
75
76 int main () {
77 solve();
78 }
题解 BZOJ4919 【大根堆】的更多相关文章
- 2021-06-14 BZOJ4919:大根堆
BZOJ4919:大根堆 Description: 题目描述 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切地说,你 ...
- BZOJ4919 大根堆(动态规划+treap+启发式合并)
一个显然的dp是设f[i][j]为i子树内权值<=j时的答案,则f[i][j]=Σf[son][j],f[i][a[i]]++,f[i][a[i]+1~n]对其取max.这样是可以线段树合并的, ...
- bzoj4919 大根堆
考虑二分求序列LIS的过程. g[i]表示长度为i的LIS最小以多少结尾. 对于每个数,二分寻找插入的位置来更新g数组. 放到树上也是一样,额外加上一个合并儿子的过程. 发现儿子与儿子直接是互不影响的 ...
- 题解 「BZOJ4919 Lydsy1706月赛」大根堆
题目传送门 题目大意 给出一个 \(n\) 个点的树,每个点有权值,从中选出一些点,使得满足大根堆的性质.(即一个点的祖先节点如果选了那么该点的祖先节点的权值一定需要大于该点权值) 问能选出来的大根堆 ...
- 【BZOJ4919】[Lydsy六月月赛]大根堆 线段树合并
[BZOJ4919][Lydsy六月月赛]大根堆 Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切 ...
- BZOJ4919[Lydsy1706月赛]大根堆-------------线段树进阶
是不是每做道线段树进阶都要写个题解..根本不会写 Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切 ...
- bzoj4919 [Lydsy1706月赛]大根堆
Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切地说,你需要选择尽可能多的节点,满足大根堆的性质: ...
- BZOJ4919:[Lydsy1706月赛]大根堆(set启发式合并)
Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切地说,你需要选择尽可能多的节点,满足大根堆的性质: ...
- bzoj 4919 [Lydsy1706月赛]大根堆 set启发式合并+LIS
4919: [Lydsy1706月赛]大根堆 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 599 Solved: 260[Submit][Stat ...
- Java实现堆排序(大根堆)
堆排序是一种树形选择排序方法,它的特点是:在排序的过程中,将array[0,...,n-1]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲节点和孩子结点之间的内在关系,在当前无序区中选择关键 ...
随机推荐
- HDU 1010 Tempter of the Bone【DFS】
学习剪枝的第一篇@_@学习别人的剪枝,一剪就是两天@_@---- 参看的这篇--http://blog.csdn.net/libin56842/article/details/8962512自己的小体 ...
- php计算两个日期相差的天数
/** * 时间差计算 * * @param Timestamp $time * @return String Time Elapsed */ function time2Units ($time,$ ...
- 联想E490 加M.2固态硬盘 卡在第一画面不动解决办法
电脑配置: E490 500G机械硬盘,自己加M.2 NVMe 固态硬盘. 问题:启动时出现 2101:Detection error on SSD1(M.2), 无法识别到机械硬盘 (重新插拨 ...
- NOI2018 你的名字 后缀自动机_线段树合并_可持久化
相当复杂的一道题,同样也相当优美.考察的知识点很多:权值线段树的可持久化合并,后缀自动机,后缀树... 考虑 $68pts$ $l=1,r=|s|$的数据:这部分相对好做一些,不过思维难度对我来说已 ...
- LA3231 Fair Share 二分_网络流
Code: #include<cstdio> #include<vector> #include<queue> #include<cstring> #i ...
- NOIp2018模拟赛四十五~??
欠的太多,咕了咕了 最近复赛临近时间紧,就不每次都写感想和题解了,只写点有意义的好题
- GDOI2016酱油记(补发)
这篇酱油记是前年发在MCHacker一个叫code-hub的博客上的(已崩),现在来补发一下... GDOI2016扯淡(爆零记) 大家好,我是巨弱DCDCBigBig,在五一期间和一群神牛去考GDO ...
- HDU-1358 Period 字符串问题 KMP算法 求最小循环节
题目链接:https://cn.vjudge.net/problem/HDU-1358 题意 给一个字符串,对下标大于2的元素,问有几个最小循环节 思路 对每个元素求一下minloop,模一下就好 提 ...
- jquery复制到剪贴板
<!DOCTYPE html> <html> <head> <title>ZeroClipboard Test</title> <me ...
- eclipse/myeclipse中js/java的自动提示只有4个字符怎么解决
https://blog.csdn.net/LinBM123/article/details/80450690