随笔分类 - 数据结构--主席树
1
摘要:"传送门" 考虑维护每个颜色的虚树 按照 $dfn$ 顺序维护这些点,在这些点上 $+1$,相邻点的 $lca$ 处 $ 1$,这样,无论包含哪一个子树的几个点,子树权值和始终为 $1$ 可以用 $set+LCA$ 实现 现在变成了二维数点的问题,按照深度依次加入每个点用主席树维护,每个线段树维护
阅读全文
摘要:题面 "传送门" Sol 二分这个最长前缀的长度 考虑$check$ 首先$s[a..b]$以$i$开头子串如果要满足和$s[c..d]$的$LCP =mid$ 那么$i$肯定是在后缀数组的$rank$的一个区间内 这个区间显然可以二分/倍增出来 $i$同时还要满足$b i+1 =mid$和$i =
阅读全文
摘要:题面 "题目传送门" 在$Bytemountains$有$N$座山峰,每座山峰有他的高度$h_i$ 有些山峰之间有双向道路相连,共$M$条路径,每条路径有一个困难值,这个值越大表示越难走 现在有$Q$组询问 每组询问询问从点$v$开始只经过困难值小于等于$x$的路径所能到达的山峰中第$k$高的山峰,
阅读全文
摘要:题面 "传送门" Sol 丽洁姐的题目还是棒棒的 考虑二分答案 $Check?$ 把小于它的设为$ 1$,大于等于它的设为$1$ $[a, b]$求一个最大后缀子段和 $[c, d]$求一个最大前缀子段和 $[b+1, c 1]$求一个和 加起来如果大于等于$0$,那么满足要求,这个数还可以变大,否
阅读全文
摘要:题意 $n$个数$a[i] ,q$次询问,$n,a[i],q define RG register define IL inline define Fill(a, b) memset(a, b, sizeof(a)) using namespace std; typedef long long ll
阅读全文
摘要:题意 给定一个长度为n的数列,有m次询问,询问形如l r k 要你在区间[l,r]内选一个长度为k的区间,求区间最小数的最大值 Sol 二分答案 怎么判定,每种数字开一棵线段树 某个位置上的数大于等于它为1 那么就是求区间最大的1的序列长度大于k 二分的最优答案一定在这个区间内,否则不优 排序后就是
阅读全文
摘要:题面 "Vjudge" Sol 给一个数列,有m个询问,每次问数列[l,r]区间中所有数的第一次出现的位置的中位数是多少,强制在线 主席树 询问区间内不同的数的个数 树上二分找到那个中位数
阅读全文
摘要:主席树乱讲 前置技能 线段树:动态开点,标记永久化,基本操作 离散化 介绍 主席树即可持久化线段树,也叫作函数式线段树 ~~至于为什么叫做主席树,据说是一个叫HJT的神犇在考场上现场yy出来的~~ 可持久化线段树: 顾名思义就是线段树经过了若干次修改之后,仍然能找到原来某次修改前的线段树的信息的一种
阅读全文
摘要:题面 "SPOJ3267" Sol 给定$N$个正整数构成的序列,将对于指定的闭区间查询其区间内的不同的数的个数 主席树 不是权值线段树 维护位置 如果插入一个数时发现之前有过了 那么修改当前的,那个位置$ 1$ 然后插入这个数字,在相应的位置$+1$ cpp include define RG r
阅读全文
摘要:题面 "vjudge" Sol 主席树模板 cpp include define RG register define IL inline define Fill(a, b) memset(a, b, sizeof(a)) using namespace std; typedef long long
阅读全文
摘要:题面 "传送门" Sol 首先每次加入边的两个点不联通,那么联通块的个数就要减$1$ 那么考虑怎么做 莫名想到$LCT$ 然后就不会了。。。 $orz$题解 维护一个每条边的数组,如果这个点加入后形成环,那么就把这个数组设为环内最先加入的边的编号,特判自环,然后替换这条边 没有替换为$0$ 那么每次
阅读全文
摘要:题面 "传送门" Sol 求前缀和之后,每次枚举左端点,找到相应的区间最大值,丢到堆里面 每次取出一个就拿出来找下一个最大值再丢进去 那么就是要求区间第$k$大,主席树就好了 ~~因为数组开小了和没开longlong,WA无数遍~~ ~~我太菜了太菜了太菜了~~ cpp include define
阅读全文
摘要:如果没有年龄区间 画图发现ans=$\sum_{i=1}^n dis_i + n dis_u 2 \sum_{i=1}^{n} dis_{lca(i, u)}$ 对$\sum_{i=1}^{n} dis_{lca(i, u)}$用树链剖分,对于每个点,都向上走到根,记录每条路经过次数,询问时从u向上
阅读全文
摘要:前50分就开两个数组,一个sum[i][j][k],表示1,1到i,j大于k的和,num[i][j][k]表示个数,二分一下就好 后50分用主席树,主席树上二分 # include <bits/stdc++.h> # define RG register # define IL inline # d
阅读全文
摘要:按位从高往低贪心,枚举到第i位,只需要判断这2^i长度的区间是否有菜,用主席树就可以了 # include <bits/stdc++.h> # define RG register # define IL inline # define Fill(a, b) memset(a, b, sizeof(
阅读全文
摘要:把一个任务拆成两个,在s时加入,在e+1时减去即可 直接离散化后上主席树 # include <bits/stdc++.h> # define IL inline # define RG register # define Fill(a, b) memset(a, b, sizeof(a)) usi
阅读全文
摘要:主席树 离散化后 每个点储存从根到它的路径上的点权 新加边时直接用启发式合并,直接把size小的重构 询问时sum[u]+sum[v]-sum[lca]-sum[fa[lca]]来比较,在树上二分 LCA用倍增求,在启发式合并时暴力更新 连通性用并查集维护,再维护每个联通快的size 空间开大点就可
阅读全文
摘要:题意 给一个数列,每次询问一个区间内有没有一个数出现次数超过一半 题解 主席树,一个数出现次数>一半,这个区间内只有这一个数满足,那么主席树直接维护所有数的出现次数,直接在树上二分查询 # include <bits/stdc++.h> # define RG register # define I
阅读全文
摘要:离散化 主席树 每个点记录它到根的路径上的点 查询时u,v,lca,fa[lca]组合起来计算即可 # include <bits/stdc++.h> # define IL inline # define RG register # define Fill(a, b) memset(a, b, s
阅读全文
1