![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
主席树
Mys_C_K
人生有许多道:曾经踏足的是道,即将踏往的也是道,那什么才是道呢?唯有脚下走的才是道。一切精神或者物质都归于虚无,然后从混沌中衍生出三万道。在悲喜间涉足一条无数前人经历过,且将有无数后人奔赴的道,无论是否已经或者将要到达彼岸,然后便不再回头或是左顾右盼,即使有些道繁盛至极,夜灯如昼,无数人一浪又一浪的涌去,造就了世人皆知的辉煌;即使有些道草木凋敝,荒草丛生,只等勇敢的开拓者斩开荆棘,创造一片天地;这些都无所关,无所在意,彼岸何如、来日何方甚至过往旧事都化作一缕云烟,飘渺碧霄,我自撷高山之月色,独随足落处往行。
展开
-
Codeforces 893F Subtree Minimum Query(Hard) 主席树
题目大意:给定一棵有根树,点x有点权a[x],多组询问,每次询问以x为根的子树中的所有满足dep[y]-dep[xi]<=ki的y中,最小的a[y]。n<=1e5, q<=1e6。强制在线。 题解:按照dfs序重新编号,这个题等价于求编号在[L[x],R[x]],深度在[dep[x],dep[x]+k]中的点权最小值。 因此就是一个二维数点(权最值)。但是随意一个矩形的最值类询问还要树套树什么的原创 2017-12-26 19:55:11 · 564 阅读 · 0 评论 -
san - 主席树优化建图 - 强连通分量
题目大意:每一个人有三个属性(ai,bi,ci),定义一个人比另一个大当且仅当有至少两维更大。保证a,b,c分别是三个排列。执行以下代码://p is a permutation of [1,n]int ans=p[1];for(int i=2;i<=n;i++) if(person[p[i]]>person[ans]) ans=p[i];return ans;问有多少人...原创 2018-12-08 15:31:05 · 293 阅读 · 0 评论 -
luogu P4755 Beautiful Pair - 启发式合并 - 主席树
题目大意:给一个非负整数数列,问有多少子区间,端点权值乘积小于等于区间最大值。(其实是启发式分裂?和这个题做法一模一样,没了。// luogu-judger-enable-o2#include<bits/stdc++.h>#define gc getchar()#define rep(i,a,b) for(int i=a;i<=b;i++)#define Rep(...原创 2018-10-29 12:32:33 · 218 阅读 · 0 评论 -
[NOI2010]超级钢琴 - 主席树 - 堆
题目大意:问长度在[L,R]的前k大子区间的和。5e5。题解:对每个右端点用主席树维护其第k大即可,然后光荣MLE。#include<bits/stdc++.h>#define gc getchar()#define rep(i,a,b) for(int i=a;i<=b;i++)#define Rep(i,v) rep(i,0,(int)v.size()-1)#de...原创 2018-10-17 14:24:03 · 233 阅读 · 0 评论 -
codeforcs 1063F. String Journey - dp -SAM - 主席树/线段树合并 - 子串定位 - 倍增
题目大意:给你一个长为nnn的字符串SSS,求最大的kkk,使得能够找出kkk个不重叠的子串t1…tkt_1\dots t_kt1…tk,使得∀i∈[1,k),∣ti∣&amp;amp;gt;∣ti+1∣\forall i\in[1,k),|t_i|&amp;amp;gt;|t_{i+1}|∀i∈[1,k),∣ti∣&amp;gt;∣ti+1∣,并且ti+1t_{i+1}ti+1是tit_iti的子串。n≤...原创 2018-10-16 13:23:23 · 304 阅读 · 0 评论 -
[Scoi2015] bzoj 4448 情报传递 - 主席树
离线链上一维数点,主席树即可事实上可以继续离线为BIT问题但没啥意思就没写。如果是离线链上二维数点不这么做就麻烦了。#include<bits/stdc++.h>#define gc getchar()#define rep(i,a,b) for(int i=a;i<=b;i++)#define Rep(i,v) rep(i,0,(int)v.size()-1)#d...原创 2018-10-18 16:00:15 · 159 阅读 · 0 评论 -
Chef and Graph Queries - LCT - 主席树
题目大意:多次询问保留编号在[L,R]之间的边图中的连通块数量。1e5。题解:固定右端点向左扫等价于求最大生成树,那么每条边出现的时间是一个区间,维护这个区间的右端点+1(也就是其被挤掉的时间)即可。#include<bits/stdc++.h>#define rep(i,a,b) for(int i=a;i<=b;i++)#define Rep(i,v) rep(i,0...原创 2018-10-05 12:40:10 · 261 阅读 · 0 评论 -
[FJOI 2016]bzoj 4408 神秘数 - 线段树
题目大意:给你一列数,多次询问用一个区间的数字形成一个可重集合,最小的不能被表示为其一个子集的数字是多少。题解:考虑给你一个可重集合你怎么算:从小到大排序,假设用前x个数字不能表示的最小都数字是ans,那么如果a[x+1]>ans,则ans就是答案,否则ans+=a[++x]。这个过程显然可以线段树每次区区间最小值,加上,然后把这个最小值设为INF,但是复杂度是不对的,例如全是1。但是发现...原创 2018-10-04 11:32:02 · 192 阅读 · 0 评论 -
方队 - 启发式合并 - 主席树
(其实是启发式分裂?大雾题目大意:n名同学要进行一次方队展示。方队展示的全过程如下:初始时,所有同学站成一横行,从左到右第i名同学编号为i,身高为ai。然后,所有同学按照一定的顺序依次出队,第i名出队的同学编号为bi。每名同学出队后,原先该同学所在的这一行会进行“变队形”操作:原先在该同学左侧的同学位置不动,在右侧的同学整体移动到队伍最后方组成新的一行,并保持他们的相对位置不变,其效果是原先的这...原创 2018-09-18 20:08:47 · 191 阅读 · 0 评论 -
疯狂求导 - BIT - 主席树
题目大意就是区间push_back一个数字,求区间不严格第K大之类的,强制在线。然后你直接像区间加区间求和的BIT那样差分后维护自己和自己乘以下标即可,O(mlg2n)O(m\lg^2n)O(mlg2n)。#include<iostream>#include<cstring>#include<cstdio>#include<algorithm&g...原创 2018-09-18 13:26:41 · 136 阅读 · 0 评论 -
字符串游戏 - 主席树 - 后缀数组
题目大意:给你个字符串,若干次询问本质不同的子串中第k1小中第k2次出现的子串,或者S[l,r]这个子串在S中的排名(本质不同的排名)以及在相同的子串中是地几个出现的。 题解:后缀数组后第一问可以预处理倍增定位然后主席树;第二问可以直接线段树。#include&lt;iostream&gt;#include&lt;cstring&gt;#include&lt;cstdio&gt;#原创 2018-09-03 18:01:42 · 205 阅读 · 0 评论 -
吊打全世界 - kruskal重构树 - 主席树 - 倍增
标题不是我起的不要D我惹 题目大意:给张无向图,多次询问是否存在从s到t的路径满足前半段路程点编号<=l,后半段点的编号>=r。 题解:一句话题解:分别建出kruskal重构树后二维数点即可。 (还有一个LCT做法并不想说) (卡常使我快乐)#include<iostream>#include<cstring>#include<cstd...原创 2018-09-04 21:08:21 · 193 阅读 · 1 评论 -
动物园 - 树剖 - 主席树
给你一棵树,支持链加,和给定一条路径x-y,假设从y走到x的权值序列是{a},求 ∑iaii2−∑iaii2∑iaii2−∑iaii2\frac{\sum_{i}a_ii^2-\sum_{i}a_ii}2,还有返回到之前某个版本。 题解:直接树剖然后可持久化掉线段树即可,维护区间∑iikai,k≤2∑iikai,k≤2\sum_{i}i^ka_i,k\le2即可。#include<i...原创 2018-08-24 21:23:14 · 212 阅读 · 0 评论 -
最近点 - 可持久化点分树 - 主席树
题目大意:给一棵树,点有黑白,每次形如翻转一个点颜色,询问到某个点的最近黑色点距离,以及返回之前某个版本。题解:显然将点分树可持久化一下,然后用一个可持久化堆(虽然写了个可持久化线段树)维护一下即可。点分树可持久化可以暴力拿个主席树维护点分树的点到堆的编号的映射,也可以将原树三度化之后直接可持久化,后者这部分复杂度一个log(但是并不很快)。#include<bits/stdc++.h&...原创 2019-03-19 15:59:52 · 530 阅读 · 0 评论