题解 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]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲节点和孩子结点之间的内在关系,在当前无序区中选择关键 ...
随机推荐
- (转载)PopuWindow和软键盘共存时的设置
PopuWindow和软键盘共存时的设置 收藏 artshell 发表于 2年前 阅读 1499 收藏 10 点赞 2 评论 0 腾讯云上实验室 1小时搭建人工智能应用 让技术更容易入门>> ...
- sqlserver 恢复模式及避免日志爆满的方法
recovery simple 循环日志,空间自动回收,不可备份日志,恢复时仅能恢复到数据库备份时间点: 用于落地数据或测试环境或OLAP,不推荐用于生产OLTP 有时候distribution过大也 ...
- hiho 172周 - 二维树状数组模板题
题目链接 描述 You are given an N × N matrix. At the beginning every element is 0. Write a program supporti ...
- HDU 1548 A strange lift【BFS】
题意:给出一个电梯,给出它的层数f,给出起点s,终点g,以及在每一层能够上或者下w[i]层,问至少需要按多少次按钮到达终点. 和POJ catch that cow一样,直接用了那一题的代码,发现一直 ...
- SpringCloud学习笔记(15)----Spring Cloud Netflix之Hystrix Dashboard的使用
1. 引入依赖 在前面几节中的消费者中添加pom依赖. <dependency> <groupId>org.springframework.cloud</groupId& ...
- vue 连接后台
在 index.js 中可以配置后台的地址:代理的方式: 这个文件在 config 中 proxyTable: { // 连接后台 '/api':{ target:"http://new.w ...
- Docker之Mysql安装及配置
原文:Docker之Mysql安装及配置 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/zhaobw831/article/details/8014 ...
- 【BZOJ 1483】[HNOI2009]梦幻布丁
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 链表,启发式合并. 把x变成y,和y全都变成x. 不论是前者还是后者.连续段的个数都是相同的,不影响结果. 那么我们把x,y中出现次 ...
- Qt之QToolButton
简述 QToolButton类提供了用于命令或选项可以快速访问的按钮,通常可以用在QToolBar里面. 工具按钮和普通的命令按钮不同,通常不显示文本,而显示图标. 简述 详细描述 常用接口 更多参考 ...
- Android中加入思源字体/NotoSansCJK/SourceHanSans
系统版本号:Android 4.2.2_r1 本文主要是在Android中加入思源字体的过程记录. 思源字体是Google和Adobe在2014.07.18公布的中文字体. 1.获取思源字体(Goog ...