——树
NOI_yzk
我爱oi oi爱我
展开
-
LCA(最近公共祖先)倍增算法
最近公共祖先有多种算法 如倍增,RMQ,树链剖分等这里先介绍倍增算法 预处理复杂度nlog(n); 询问复杂度log(n);倍增与二进制息息相关 与分块的算法有些相似之处使用倍增算法时开一个fa[n][S]数组 fa[i][j] 表示 i 这个点向上的第1^j个父亲是谁以下是关于如何预处理fa[i][j] 的代码void init() { FOR(j,1,S-1)FOR(i,1,n原创 2017-09-22 15:55:54 · 669 阅读 · 0 评论 -
DFS序+线段树
由于建树的时候使用的是深度优先遍历 则子树节点的遍历时间是连续的 所以,可以用线段树解 线段树的l,r表示时间 然后用Lx[x]和Rx[x]来表示进入x子树的时间和出x子树的时间 例题:1466 苹果树 题目描述:在卡卡的房子外面,有一棵苹果树。每年的春天,树上总会结出很多的苹果。卡卡非常喜欢吃苹果,所以他一直都精心的呵护这棵苹果树。我们知道树是有很多分叉点的,苹果会长在枝条原创 2017-09-21 22:26:12 · 371 阅读 · 0 评论 -
MIS
2947 MIS 题目描述 长度为m的递增子序列(M length IncreaseSubsequence),称为MIS。 求长度为n的序列,有多少个MIS。子序列不需要在原序列中不需要连续,但要保证相对位置。 输入 第一行两个整数n和m第二行n个整数,表示一个序列。 输出 输出MIS的个数,结果对20140921取余。 对于100%的数据,n的范围[1,10000],m原创 2017-09-26 14:15:00 · 428 阅读 · 0 评论 -
道路改建
题目描述 一个由n户人家组成的村庄,用n-1条路径连接,形成一棵树。 现在进行道路改建,先把某条边的删除,再用这条边连接其他两个点(保持长度相同)。 使得最后村庄之间仍能相互到达,且最远的两个村庄之间的距离最小。 输入 第一行一个整数n,表示村庄的个数。 接下来n-1行,每行3个整数a、b、c,表示有一条路径连接编号为a和b的村庄(编号从0开始)。 输出 输出可以使原创 2017-09-30 10:58:50 · 761 阅读 · 1 评论 -
买房子2
题目描述 有天小C突发奇想,自己是不是也该考虑一下买房子的问题了。小C所在的城市被划分成n个区域,这n个区域是连通的,并且从任意一个区域到达另外区域的方案数只有一种。现在这n个区域都有房卖,小C想,如果他要选择买房区域的话,他所在的区域到其他的区域的距离的最远距离是多少。现在告诉你n个区域的连接情况,请你帮他算算,输出对于每个区域离它最远的距离是多少? 输入 输入第一行,一个整数n; 接原创 2017-09-30 11:17:14 · 406 阅读 · 0 评论 -
Paths(树上的贪心)
当数据为一条链的时候 很显然可以用类似于看电视的贪心按尾排序 可以把这个引申到树上首先,去每个路径的收益为一,这与看电视相似 我们应该自己创造一个顺序 使取了这个点之后,满足一段区间具有最优解我们按照路径两端点LCA的deep由深到浅排序当我们取了i这个点之后,满足i的子树不再会被取到 由于之后路径的lca的deep会大于或小于当前i的lca的deep 这里分三种情况: 1.下一个点的原创 2017-10-10 11:06:37 · 330 阅读 · 0 评论 -
树链剖分求lca模板
传说中比O(1)还快的求LCA的方法 再加上正向表优化,#include<cstdio>#include<cstring>#include<vector>using namespace std;#define M 100005#define FOR(i,x,y) for(int i=(x);i<=(y);i++)#define DOR(i,x,y) for(int i=(x);i>=(原创 2017-11-02 08:53:15 · 345 阅读 · 1 评论 -
跑步爱天天(欧拉序入门)
考试的时候已经处理出了欧拉序,但并没有关注到它的种种性质这里给出欧拉序的定义与运用 树的欧拉序是对树进行DFS的一种序列。 有两种形式: 1、在每个结点进和出都加进序列。 2、只要到达每一个结点就把他加进序列。 第一种方法得到的序列和对应的进出状态分别是: 1 2 3 3 4 4 5 5 2 6 7 7 8 8 6原创 2017-10-16 15:56:07 · 20020 阅读 · 0 评论