首页 > 其他分享 >Ybt 金牌导航 6.1.F 大根堆 / BZOJ 4919 大根堆(LIS,启发式合并)

Ybt 金牌导航 6.1.F 大根堆 / BZOJ 4919 大根堆(LIS,启发式合并)

时间:2024-01-22 22:33:45浏览次数:27  
标签:大根堆 set 4919 元素 Ybt 点集 maxn 启发式

题意简述

有一个以 \(1\) 为根的有根树,每个点有权值 \(v_i\)。你需要选出一个点集 \(S\),使得点集里任意两个元素 \(x,y\),若 \(x\) 在原树上是 \(y\) 的祖先,则要满足 \(v_x>v_y\)。求选出的点集的最大大小是多少。

解法

原题限制相当于:在选出的点集构成的新树 \(T\) 中,每个点到根节点上的点权形成上升子序列。要让点集大小最大,就是让上升子序列长度最大。

不会最长上升子序列的建议前往这里

先说做法:对每个节点维护一个 set,合并子树的 set 时用启发式合并,插入元素时寻找第一个大于等于它本身的元素,删除原来的元素,并加入这个元素。若没有,直接加入。最终根节点的 set 大小就是答案。

代码略去缺省源。

点击查看代码
int n,m,a[maxn];
vector<int>G[maxn];
multiset<int>s[maxn];
void merge(multiset<int>&x,multiset<int>&y){
	if(x.size()<y.size())swap(x,y);
	while(!y.empty())x.insert(*y.begin()),y.erase(y.begin());
}
void dfs(int x){
	for(int u:G[x]){
		dfs(u);merge(s[x],s[u]);
	}
	auto it=s[x].lower_bound(a[x]);
	if(it!=s[x].end())s[x].erase(it);
	s[x].insert(a[x]);
}
void solve_the_problem(){
	n=rd(),a[0]=inf;
	rep(i,1,n){
		int x;a[i]=rd(),x=rd();
		G[x].pb(i);
	}
	dfs(1);
	write(s[1].size());
}

标签:大根堆,set,4919,元素,Ybt,点集,maxn,启发式
From: https://www.cnblogs.com/dcytrl/p/17981210

相关文章

  • springboot+mybtais+mysql
    一、通过maven引入相应的包pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http......
  • 大根堆和小根堆
    #include<iostream>usingnamespacestd;inth[1000000];intz=0;//z表示数列中有几个元素voidup(intx){ while(x>1&&h[x]<h[x/2]){ swap(h[x],h[x/2]); x/=2; }}voiddown(intx){ while(x*2<=z){ intt=x*2; if(t+1<=z&&......
  • 大根堆/小根堆
    #include<iostream>#include<algorithm>#include<vector>#include<queue>#include<random>#include"util.h"usingnamespacestd;structPoint{intx,y;//priority_queue<Point>大根堆需要重载小于号boolo......
  • ACAM 学习笔记 | 附 YbtOJ 全部题解
    怎么有人现在才学ACAM呢。好像比SAM简单挺多啊,也不记得当时是哪里看不懂。AC自动机(✔)自动AC机(✘)概述ACAM(Aho–CorasickAutomaton),是用来解决多模式串匹配的字符串算法。它的结构是个DAG,其中点表示状态,边表示转移。这一点上各种自动机都是相同的。具体来说,可以感性......
  • ybtoj字典树练习
    E.1.单词拼接纯狗题,本题交了52发,谁看这个数据范围谁倒霉,真的我祝出题人幸福,看到5e3我果断开始map复杂度\(O(n^2logn)\)#include<bits/stdc++.h>usingnamespacestd;map<string,int>mp;constintmaxn=5e3+5;strings[maxn];map<string,int>mp2;signedmain()......
  • YBTOJ 1.2贪心算法
    A.奶牛晒衣服......
  • python 大根堆
    python默认的都是小根堆,实现数字的大根堆,可在堆化前把数字乘以-1,输出时再乘以-1变回原值。比如:[5,20,6],堆化前用列表推导式把列表转为: [-5,-20,-6]importheapqimportrandomdata=list(range(1,30))random.shuffle(data)#打乱顺序data=data[:12]#......
  • ybtoj dp T2恐狼后卫
    点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e3+7;intn,atk;inta[N],b[N],h[N],times[N],f[N][N];signedmain(){scanf("%lld%lld",&n,&atk);cerr<<n<<""<&......
  • 大根堆和小根堆在海量数据的top N问题中,时间复杂度O(nlogN)
    堆可视化操作演示:https://visualgo.net/zh/heap堆实际上是一棵完全二叉树,其任何一非叶节点满足性质:小根堆:Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]或者大根堆Key[i]>=Key[2i+1]&&key>=key[2i+2]即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。堆分为大根堆......
  • HZOI 大根堆 线段树合并
    题目描述给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点。每个点有一个权值v_i。你需要将这棵树转化成一个大根堆。确切地说,你需要选择尽可能多的节点,满足大根堆的性质:对于任意两个点i,j,如果i在树上是j的祖先,那么v_i>v_j。请计算可选的最多的点数,注意这些点不必形成......