![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
树
Tz_rain
需要做的事情
解题 总结 巩固
解题三个步骤
量化 分析 实现
需要改变的三个问题
性格 心态 思考方式
不要再后悔
展开
-
平均距离
平均距离时间限制: 1 Sec 内存限制: 128 MB 题目描述 给定一棵树,求出任意两点之间的平均距离,如下图,平均值为(D01+ D02 + D03 + D04 + D12 +D13 +D14 +D23 +D24 +D34)/10 = (6+3+7+9+9+13+15+10+12+2)/10 = 8.6 输入 输入第一行,一个整数n;接下来n-1行,每行三个整数a,b,c,表示连接节原创 2016-10-12 11:02:47 · 843 阅读 · 0 评论 -
城市网络——可持久化栈
思路 我们发现对于树上[l,r][l,r]的路径一定是包含在从根节点出发的某条链中的。 而DFSDFS的过程中恰好便利了所有的这样的链于是我们可以用一个单调栈来维护有关链的答案。 有了单调栈以后我们可以通过二分以o(logn)o(log_n)的复杂度来求解了。 可是此时我们发现DFSDFS的过程中每次我们加入新的节点之后单调栈就发生了变化,在添加下一个节点的时候就不可用了。举一个简单的例子 可此原创 2017-07-08 20:30:59 · 680 阅读 · 0 评论 -
Tarjan算法详解
Tarjan算法的用途 1.求桥和割点 2.求点和边的双连通分量 3.求强连通 Targan算法的流程 利用dfs来遍历图来构建一种数型的结构 Tarjan算法的两个核心数组 dfn:我们用dfn数组记录 low:我们用low[i]表示一个节点的子树中可以到达最小的dfn (显然对于一个刚刚遍历到的点我们给他赋上一个新的dfn,low)<1>对于第一种用途 Tarjan算法原理原创 2017-03-16 19:49:19 · 833 阅读 · 0 评论 -
一九八四
Tarjan算法 我们发现对于一些在图上操作和查询的问题,有时我们可以通过Tarjan来的实现。 这里我们针对利用Tarjan解决有关图的联通的问题 思路 我们发现把一个图转换成一个树的时候,点的联通情况是不变的。 流程 我们先把图建成树,并且把每个点在那棵树记录下来 对于删边的操作有以下的条件要判断 S和T不在一棵树 falsefalse 边不是树上的边 truetrue 如果S,TS,T都不在原创 2017-07-02 09:49:58 · 278 阅读 · 0 评论 -
线段树的合并
原理和思路思路 我们常常会遇到一些问题对于每一个点都有它的一些信息 然后我们需要查询一段区间 或者是树上一个点的子树信息 此时我们便可以通过线段树的合并来解决这些问题 原理 我们通过把信息合并以后,利用合并后的线段树来实现lognlog_n的查询 有时候我们也可以事先预处理好以方便查询 基本流程 就像建主席树一样,对每一个点我们为它造一个树 之后我们对不同的节点进行合并 为了使合并可持久化我们原创 2017-05-11 19:25:48 · 336 阅读 · 0 评论 -
SRM 559 Div1 500 HatRack
/* 计算出每个节点对应子树的方法相乘即可 */ #include<bits/stdc++.h> using namespace std; typedef long long ll; #define M 55 int n,ch[M][M]; vector<int>G[M]; ll dfs(int x,int f=0,int p=1){ ch[x][0]=0; for(in原创 2017-04-30 19:26:39 · 258 阅读 · 0 评论 -
主席树
主席树是什么主席树:是一种前缀树,通过一个地址root[i]−>root[i−1]root[i]->root[i-1]来实现的;建树 如上图所示,我们在插入元素的时候分别为每一个元素都给它建一个树void init(int &p,int l,int r){ p=++tot; T[p].v=0; if(l==r)return;原创 2017-03-23 21:28:00 · 427 阅读 · 0 评论 -
划分树
求区间第K大值 划分树#include<stdio.h> #include<algorithm> using namespace std; const int M=1e5+5; int T[20][M],S[M]; int toleft[20][M],n,m; void build(int l=1,int r=n,int p=1){ if(l==r)r原创 2017-03-22 21:28:35 · 219 阅读 · 0 评论 -
2017.3.10NOIP模拟赛题解及反思(伪)
我没有参加本次考试。。。。。。第一题我们发现对于一个{1~i}的序列有k个逆序对,如果想让它增加a(0<=a<=i)个其方案是唯一的 所以 我们用dp[i][j]dp[i][j]表示用了{1~i}的序列形成了j个逆序对的方案数 dp[i][j]=∑ja=0dp[i][j]=\sum_{a=0}^j dp[i−1][a]dp[i-1][a]#include<bits/stdc++.h> usi原创 2017-03-21 18:34:23 · 342 阅读 · 0 评论 -
树链剖分专题
基本定义 deep:深度 size:一个节点的子树的节点数 son:重儿子(size最大的) fa:节点的父亲 top:节点所在链的最高节点 基本思路 第一次dfs找到节点所有的基本信息; 第二次dfs沿着重儿子造成重链,以其他节点造新的重链; 于是树就被转化为链了。 然后再用其他数据结构优化 为了使所有的链连在一起我们可以给所有的点一个编号。 原理 由于一个点在被查询的过原创 2017-03-07 20:28:08 · 226 阅读 · 1 评论 -
SRM 638 DIV2 CandleTimerEasy
现在有n-1个蜡烛,如果点燃了长度为L的蜡烛的一段,那么就需要L个单位时间将这根蜡烛烧完。如果在蜡烛的两端同时点火,那么就只要一半的时间。把蜡烛作为边摆放成一棵有n个节点树,每个节点都是一根或多根蜡烛的一端。在0时刻可以选择任意一个或多个度为1的节点点火,那么经过一定的时间所有的蜡烛都会被燃烧殆尽。注意,如果火焰燃到了一个节点,那么所有以该节点作为端点的蜡烛都会点上火。求对于0时刻不同的点蜡烛的方式原创 2017-02-01 14:49:59 · 243 阅读 · 0 评论 -
买房子
买房子 Time Limit: 10000MS Memory Limit: 65536K Description 有天小C突发奇想,自己是不是也该考虑一下买房子的问题了。小C所在的城市被划分成n个区域,这n个区域是连通的,并且从任意一个区域到达另外区域的方案数只有一种。现在这n个区域都有房卖,小C想,如果他要选择买房区域的话,他所在的区域到其他的区域的原创 2016-10-20 19:48:21 · 555 阅读 · 0 评论 -
Dsu on tree 神奇的暴力
什么是dsu这是一个很暴力很无脑的算法。 对于一棵树如果我们需要计算每个节点对应子树的信息。 由于每个父节点的信息来自每个子节点。我们来用以下的流程来合并信息。 为什么可以用dsu显然对于一个节点它只会被合并(lognlog_n)次所以复杂度可以为n∗(logn)n*(log_n) 例如我们要:统计子树内出现次数不少于k的元素个数。void dfs_pre(int x,int f){原创 2017-03-21 21:53:24 · 2787 阅读 · 2 评论