题面:传送门


老师说今天要考一道线段树合并,然后。。。然后这道题我就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 【大根堆】的更多相关文章

  1. 2021-06-14 BZOJ4919:大根堆

    BZOJ4919:大根堆 Description: 题目描述   给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切地说,你 ...

  2. 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.这样是可以线段树合并的, ...

  3. bzoj4919 大根堆

    考虑二分求序列LIS的过程. g[i]表示长度为i的LIS最小以多少结尾. 对于每个数,二分寻找插入的位置来更新g数组. 放到树上也是一样,额外加上一个合并儿子的过程. 发现儿子与儿子直接是互不影响的 ...

  4. 题解 「BZOJ4919 Lydsy1706月赛」大根堆

    题目传送门 题目大意 给出一个 \(n\) 个点的树,每个点有权值,从中选出一些点,使得满足大根堆的性质.(即一个点的祖先节点如果选了那么该点的祖先节点的权值一定需要大于该点权值) 问能选出来的大根堆 ...

  5. 【BZOJ4919】[Lydsy六月月赛]大根堆 线段树合并

    [BZOJ4919][Lydsy六月月赛]大根堆 Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切 ...

  6. BZOJ4919[Lydsy1706月赛]大根堆-------------线段树进阶

    是不是每做道线段树进阶都要写个题解..根本不会写 Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切 ...

  7. bzoj4919 [Lydsy1706月赛]大根堆

    Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切地说,你需要选择尽可能多的节点,满足大根堆的性质: ...

  8. BZOJ4919:[Lydsy1706月赛]大根堆(set启发式合并)

    Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切地说,你需要选择尽可能多的节点,满足大根堆的性质: ...

  9. bzoj 4919 [Lydsy1706月赛]大根堆 set启发式合并+LIS

    4919: [Lydsy1706月赛]大根堆 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 599  Solved: 260[Submit][Stat ...

  10. Java实现堆排序(大根堆)

    堆排序是一种树形选择排序方法,它的特点是:在排序的过程中,将array[0,...,n-1]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲节点和孩子结点之间的内在关系,在当前无序区中选择关键 ...

随机推荐

  1. ubuntu上配tensorflow

    前一阵绕了大弯路,基本弄好了UEFI双系统后,面对的就是CUDA咋装在Linux. 好在教程好多,有些朋友建议先装CUDA再装显卡驱动.弄好之后记录一下详细过程吧. *** 这两天看了一些教程,还是感 ...

  2. <Three.js>(第三节)全景漫游

    一.实验内容 通过上次实验,了解了Three.js创建场景的基本步骤.这一节,我们将通过Three.js实现全景漫游功能.如下图: 全景图是获取一个3D场景中的不同角度的图片,然后通过拼接.融合实现3 ...

  3. 用Maven创建第一个web项目Struts2项目

    一.创建一个web项目 参考前面文章,项目名:maven-struts-demo. 二.配置pom.xml文件添加struts2依赖 <project xmlns="http://ma ...

  4. Sublimi Text3 下Emmet使用技巧

    Emmet真的好用,可以少写很多代码. 初始化文档 HTML文档需要包含一些固定的标签,比如<html>.<head>.<body>等,现在你只需要1秒钟就可以输入 ...

  5. SpringBoot学习笔记(4)----SpringBoot中freemarker、thymeleaf的使用

    1. freemarker引擎的使用 如果你使用的是idea或者eclipse中安装了sts插件,那么在新建项目时就可以直接指定试图模板 如图: 勾选freeMarker,此时springboot项目 ...

  6. Js jquery常用的身份证号码 邮箱电话等验证

    刷了很多博客,https://www.cnblogs.com/hao-1234-1234/p/6636843.html 只有这个比较靠谱.

  7. 异步线程编程,线程池,线程组,后面涉及ThreadLocal在理解

    join模拟订单 package com.future.demo.future; /** * * * @author Administrator * */ public class NormalThr ...

  8. vector迭代器

    https://www.cnblogs.com/quant-lee/p/6618829.html

  9. (2016北京集训十四)【xsy1557】task

    题解: 限制可以看成图状结构,每个任务的对物品数量的影响可以看成权值,只不过这个权值用一个五元组来表示. 那么题意要求的就是最大权闭合子图,网络流经典应用. 代码: #include<algor ...

  10. BZOJ3796 Mushroom追妹纸(二分答案+后缀数组+KMP)

    求出一个串使得这个串是\(s1,s2\)的子串.串中不包含\(s3\). 如果没有这个\(s3\)就可以二分答案,然后height小于二分值分一组.看看每组里是不是出现过\(s1,s2\)的后缀.判断 ...