博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[bzoj4919]大根堆
阅读量:4563 次
发布时间:2019-06-08

本文共 1741 字,大约阅读时间需要 5 分钟。

题面

给定一棵\(n\)个节点的有根树,编号依次为\(1\)\(n\),其中\(1\)号点为根节点。每个点有一个权值\(v_i\)

选择尽可能多的节点,使对于任意两个点\(i,j\),如果\(i\)在树上是\(j\)的祖先,那么\(v_i>v_j\)
请计算可选的最多的点数,注意这些点不必形成这棵树的一个连通子树。

  • \(n\leq2*10^5\)

    解析

    这题无非想让选出的这些点自下往上都能构成最长上升子序列

    于是自下往上每条链都维护一下最长上升子序列。
    如果两链相交,把两条序列直接合并(因不影响答案)。
    然后尝试把交点(\(LCA\))加入序列即可。

关键是怎么维护这东西。

线段树合并???怒码\(3KB\)???
\(set\)神器拯救一切。
而且由于合并时两链(树)互不影响,可以启发式合并。(如果父亲已有序列长度小于儿子,可以父子完全交换)。
复杂度\(O(nlog^2n)\)

#include
#include
#include
#include
#include
#include
#include
#include
#define re register#define il inline#define ll long long#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b))#define fp(i,a,b) for(re int i=a;i<=b;i++)#define fq(i,a,b) for(re int i=a;i>=b;i--)using namespace std;const int mod=1e9+7,N=2e5+100,M=3000;struct Edge{int to,nxt;}e[N<<1];int n,h[N],cnt,w[N];multiset
f[N];il void add(re int u,re int v){ e[++cnt]=(Edge){v,h[u]};h[u]=cnt; e[++cnt]=(Edge){u,h[v]};h[v]=cnt;}il ll gi(){ re ll x=0,t=1; re char ch=getchar(); while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar(); if(ch=='-') t=-1,ch=getchar(); while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar(); return x*t;}il void dfs(re int u,re int fa){ for(re int i=h[u];i+1;i=e[i].nxt) { re int v=e[i].to; if(v==fa) continue; dfs(v,u); if(f[v].size()>f[u].size()) swap(f[v],f[u]); for(set
::iterator j=f[v].begin();j!=f[v].end();j++) f[u].insert(*j); f[v].clear(); } if(f[u].size()>0&&f[u].lower_bound(w[u])!=f[u].end()) f[u].erase(f[u].lower_bound(w[u])); f[u].insert(w[u]);}int main(){ memset(h,-1,sizeof(h)); n=gi(); fp(i,1,n) w[i]=gi(),add(i,gi()); dfs(1,0); printf("%lld\n",1ll*f[1].size()); return 0;}

转载于:https://www.cnblogs.com/yanshannan/p/9471557.html

你可能感兴趣的文章
巧用网盘托管私人Git项目
查看>>
python全栈脱产第19天------常用模块---shelve模块、xml模块、configparser模块、hashlib模块...
查看>>
[LeetCode] House Robber
查看>>
virtualbox中kali虚拟机安装增强功能
查看>>
java生成六位验证码
查看>>
iOS的MVP设计模式
查看>>
stringstream
查看>>
【转】HDU 6194 string string string (2017沈阳网赛-后缀数组)
查看>>
前后端分离
查看>>
渗透测试学习 一、环境搭建
查看>>
处理图片透明操作
查看>>
Postman-OAuth 2.0授权
查看>>
mac pycharm打不开问题
查看>>
iOS项目之苹果审核被拒
查看>>
java多态及tostring方法与equals方法的重写
查看>>
python 获取远程设备ip地址
查看>>
JDBC 第五课 —— 小项目的界面升级
查看>>
团队作业3——需求改进&系统设计
查看>>
返回json格式时间,解析时间
查看>>
线程并发-栈限制&ThreadLocal
查看>>