
【算法】树链剖分
文章平均质量分 66
cz_xuyixuan
这个作者很懒,什么都没留下…
展开
-
【BZOJ1036】【ZJOI2008】树的统计
【题目链接】点击打开链接【思路要点】树链剖分模板题。时间复杂度\(O(QLog^{2}N)\)。【代码】#includeusing namespace std; #define MAXN 30005#define MAXLOG 20#define INF 1e9vector a[MAXN]; struct Node {原创 2018-01-15 17:13:28 · 247 阅读 · 0 评论 -
【LOJ3044】「ZJOI2019」Minimax 搜索
【题目链接】点击打开链接【思路要点】首先考虑如何求出 PreiPre_iPrei 表示稳定度在 iii 以内的集合的个数,若求得 PreiPre_iPrei ,则有 Ansi=Prei−Prei−1Ans_i=Pre_i-Pre_{i-1}Ansi=Prei−Prei−1 。注意到各叶子节点权值不同,其权值最后作为根节点权值的叶子结点是唯一的,记为 keykeykey...原创 2019-04-02 18:20:03 · 1542 阅读 · 0 评论 -
【CodeForces725G】Messages on a Tree
【题目链接】点击打开链接【思路要点】将询问 (x,t)(x,t)(x,t) 按照 depthx+tdepth_x+tdepthx+t 为第一关键字, xxx 为第二关键字排序,那么首先,所有询问只会收到其之前的询问的影响,因此我们可以依次处理它们。其次,可以发现,如此排序后,排在前面的询问将比排在后面的询问先到达任何一个两个询问都会到达的点。考虑记录 timeritimer...原创 2019-04-12 15:33:05 · 350 阅读 · 0 评论 -
【CodeForces704E】Iron Man
【题目链接】点击打开链接【思路要点】考虑链上做法,每个人的坐标是一个关于时间的一次函数。注意到当且仅当两人相碰,两人位置的相对顺序会发生改变,换言之,在两人相碰之前,所有人位置的相对顺序不变。排序所有人出现,消失的事件,用平衡树维护所有人的相对位置即可。回到原题,对原树进行树链剖分,对每条重链和轻边都运行链上做法即可。时间复杂度 O(N+MLog2N)O(N+MLog^2...原创 2019-04-12 15:33:11 · 514 阅读 · 0 评论 -
【CodeForces】CodeForces Round #530 (Div. 1) 题解
【比赛链接】点击打开连接【题解链接】点击打开链接**【A】**Sum in the tree【思路要点】题目中给出的限制条件相当于限定了所有深度为奇数的点及其父亲的权值和,显然,将深度为偶数的非叶节点的权值设置得尽可能大有利于减少全局权值和。时间复杂度 O(N)O(N)O(N) 。【代码】#include<bits/stdc++.h>usi...原创 2019-01-20 11:30:34 · 651 阅读 · 0 评论 -
【CodeChef】Adi and the Tree
【题目链接】点击打开链接【思路要点】首先,一条边不会在一种方案中被计算 x (x>1)x\ (x>1)x (x>1) 次,否则我们可以构造出一种只计算这条边 x%2x\%2x%2 次的方案,方案会变优。考虑一条边何时会被计算,显然当其两侧的点数均为奇数时,这条边会被计算。由于题目保证了任意时刻总点数为偶数,我们只需要计算子...原创 2018-12-09 11:24:43 · 216 阅读 · 0 评论 -
【51Nod2004】终结之时
【题目链接】点击打开链接【思路要点】建出 支配树 ,剩余的操作均可以通过轻重链剖分+线段树解决。时间复杂度 O(QLog2N+M)O(QLog^2N+M)O(QLog2N+M) 。另外,等到笔者写完可持久化后才发现这个题的可持久化是假的,只需要将之前进行的操作减回去即可,这样做空间复杂度就不会高达 O(NLog2N)O(NLog^2N)O(NLog2N) 了。但可持久化的版本...原创 2018-09-20 12:35:56 · 390 阅读 · 0 评论 -
【CodeForces】CodeForces Round #502 (Div. 1 + Div. 2) 题解
【比赛链接】 点击打开连接 【题解链接】 点击打开链接 **【A】**The Rank 【思路要点】 按照题意模拟。 时间复杂度O(N)O(N)O(N)。 【代码】 #include<bits/stdc++.h>using namespace std;const int MAXN = 100...原创 2018-08-13 15:33:05 · 361 阅读 · 0 评论 -
【BZOJ3683】Falsita
【题目链接】 点击打开链接 【思路要点】 不考虑修改,计算出答案tansitansitans_i。 接下来我们只考虑每一次修改对合法点对权值的期望tanstanstans或总和sumsumsum所有产生的增量。 对于单点修改操作(x,y)(x,y)(x,y),我们考虑其对sumsumsum的增量,应当为:xxx到rootrootroot的路径上每一个点...原创 2018-07-02 21:37:45 · 409 阅读 · 0 评论 -
【BZOJ3531】【SDOI2014】旅行
【题目链接】点击打开链接【思路要点】树链剖分,对每个信仰开一棵线段树即可。时间复杂度\(O(N+QLog^2N)\)。【代码】#include<bits/stdc++.h>using namespace std;const int MAXN = 100005;const int MAXP = 1e7 + 5;template <typename T> void ch...原创 2018-05-23 11:14:22 · 178 阅读 · 0 评论 -
【CodeForces487E】【UOJ30】Tourists
【题目链接】CodeForcesUOJ【思路要点】首先我们来证明点双连通分量的一个性质。引理:在一个点双连通分量中,给定任意三个不同的点\(a\),\(b\),\(c\),一定存在一条从\(a\)到\(c\)的,经过每个点至多一次的简单路径经过了\(b\)。证明:考虑网络流。在原图中存在无向边的点对之间建立无向边,容量为1;对每个点拆点限流,容量为1;由\(a\)和\(c\)向汇点连边,容量为1;...原创 2018-05-20 11:00:27 · 322 阅读 · 0 评论 -
【BZOJ4515】【SDOI2016】游戏
【题目链接】点击打开链接【思路要点】先树链剖分,然后用李超线段树维护序列,支持一段区间对某一次函数取Min,以及查询区间最小值。由于需要区间定位,单次1号操作的时间复杂度为\(O(Log^3N)\),单次2号操作的时间复杂度为\(O(Log^2N)\)。总时间复杂度\(O(MLog^3N)\),但数据没有将该做法的复杂度卡满,实际上做到这一点也很难,因此该做法可以通过本题,甚至跑得很快。【代码】#...原创 2018-05-19 13:46:34 · 341 阅读 · 0 评论 -
【BZOJ4855】【JSOI2016】轻重路径
【题目链接】点击打开链接【思路要点】考虑将问题离线,将删点变成加点。由题,一条从任意一个点到根的路径上至多有\(O(LogN)\)条轻边,而加入一个点不会使其到根路径上的重边变成轻边,因此加入一个点至多改变\(O(LogN)\)个点的轻重划分。对原树进行树链剖分,用树状数组支持询问某一个点当前的子树大小以及一条原树重链上轻边的位置。每加入一个点后找到该点到根路径上所有的轻边,并更新它们即可。还有一...原创 2018-04-13 20:03:22 · 866 阅读 · 0 评论 -
【BZOJ4196】【UOJ128】【NOI2015】软件包管理器
【题目链接】点击打开链接【思路要点】树链剖分,子树是DFS序中连续的一段,而路径由至多\(O(LogN)\)段组成,剩余部分用线段树解决即可。时间复杂度\(O(QLog^{2}N)\)。【代码】#includeusing namespace std; #define MAXN 120000struct node { int l原创 2018-01-15 17:24:26 · 375 阅读 · 0 评论 -
【LOJ574】「LibreOJ NOI Round #2」黄金矿工
【题目链接】点击打开链接【思路要点】可参考 官方题解 。以下为笔者个人的见解,方便起见,下称矿工为老鼠,金矿为洞。我们可以对洞的权值加上深度,老鼠的权值减去深度,从而不需要考虑树的边权。考虑新加一只老鼠带来的影响,可能的结果有如下三种:(1)(1)(1) 、与一个尚未匹配的洞一起加入当前已经匹配的集合。(2)(2)(2) 、取代当前已经匹配的集合中的一只老鼠。(3)(...原创 2019-07-07 20:35:52 · 1366 阅读 · 1 评论