[BZOJ 4771]七彩树(可持久化线段树+树上差分) 题面 给定一棵n个点的有根树,编号依次为1到n,其中1号点是根节点.每个节点都被染上了某一种颜色,其中第i个节点的颜色为c[i].如果c[i]=c[j],那么我们认为点i和点j拥有相同的颜色.定义depth[i]为i节点与根节点的距离.为了方便起见,你可以认为树上相邻的两个点之间的距离为1.站在这棵色彩斑斓的树前面,你将面临m个问题. 每个问题包含两个整数x和d,表示询问x子树里且depth不超过depth[x]+d的所有点中出现了多少种…
题面:Rmq Problem / mex 题解: 先离散化,然后插一堆空白,大体就是如果(对于以a.data<b.data排序后的A)A[i-1].data+1!=A[i].data,则插一个空白叫做A[i-1].data+1, 开头和最尾也要这么插,意义是如果取不了A[i-1]了,最早能取的是啥数.要把这些空白也离散化然后扔主席树里啊. 主席树维护每个数A[i]出现的最晚位置(tree[i].data),查询时查询root[R]的树中最早的data<L的节点(这意味着该节点的下标离散化前代…
BZOJ 考虑没有深度限制,对整棵子树询问怎么做. 对于同种颜色中DFS序相邻的两个点\(u,v\),在\(dfn[u],dfn[v]\)处分别\(+1\),\(dfn[LCA(u,v)]\)处\(-1\),这样答案就是求子树和了(同种颜色多余贡献的会被减掉). 对于深度的限制,考虑维护\(\max\{dep\}\)棵线段树\(T_i\),分别表示只考虑深度在\(1\sim i\)之间的点的贡献(下标依旧是DFS序).因为我们发现,对于询问\((x,k)\),求\(T_{dep[x]+k}\)这…
题目大意: 给定一颗树,询问树中某个点x的子树中与其距离不超过d的所有点中本质不同的颜色数 强制在线 题解: 一下午终于把这道题叉掉了. 写了三个算法,前两个都是错的,后一个是%的网上大爷们的题解. 首先我们发现这道题有一个特点:没有修改操作 !! 这就使我们能够对颜色进行预处理. 所以我们可以考虑分别枚举每个颜色,对其去重后更新树上的信息. 所以我们可以考虑树链的并,我们可以对每种颜色都做一遍树链的并 容易发现复杂度仍然是\(O(nlogn)\)的 但是这样我们只求出来的每个节点子树中不同的颜…
这个思路挺有意思的 ~ 利用树链的并来保证每个颜色只贡献一次,然后用可持久化线段树维护 code: #include <set> #include <cstdio> #include <cstring> #include <algorithm> #define N 100005 #define setIO(s) freopen(s".in","r",stdin) , freopen(s".out",…
给定一棵n个点的有根树,编号依次为1到n,其中1号点是根节点.每个节点都被染上了某一种颜色,其中第i个节 点的颜色为c[i].如果c[i]=c[j],那么我们认为点i和点j拥有相同的颜色.定义depth[i]为i节点与根节点的距离 ,为了方便起见,你可以认为树上相邻的两个点之间的距离为1.站在这棵色彩斑斓的树前面,你将面临m个问题. 每个问题包含两个整数x和d,表示询问x子树里且depth不超过depth[x]+d的所有点中出现了多少种本质不同的颜色 .请写一个程序,快速回答这些询问. 输入 第…
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3483 [题目大意] 给出一些串,同时给出m对前缀后缀,询问有多少串满足给出的前缀后缀模式, 题目要求强制在线 [题解] 我们对于给出的每个字符串正着插入字典树A,倒着插入字典树B, 对于一个前缀来说,在字典树A上得到的dfs序[st,en]就是所有的匹配串, 同理,后缀在字典树B上dfs序[st,en]表示所有的后缀匹配串, 同时满足两者的需提供二维查询,因此我们以Adfsn为版本,…
首先离散化,然后我们知道如果对于一个询问的区间[l1,r1],[l2,r2],我们二分到一个答案x,将[l1,r2]区间中的元素大于等于x的设为1,其余的设为-1,那么如果[l1,r1]的最大右区间和加上[r1,l2]的区间和加上[l2,r2]的最大左区间和大于等于0,那么最大的中位数一定大于等于x.因为这个区间中大于等于x的数量超过了一半,那么我们可以二分答案,然后判断最大的合法(见上文)区间和是否大于等于0. 那么对于每个我们二分的值的区间-1,1情况我们不能建立n颗线段树,我们可以建立可持…
题目大意:给定n个字符串,对于每一个字符串求以这个字符串为后缀的字符串中第k小的编号 首先将字符串反转 那么就变成了对于每一个字符串求以这个字符串为前缀的字符串中第k小的编号 然后考虑对字符串排序 那么对于每一个字符串以它为前缀的字符串一定是连续的 那么就转化成了区间第k小 这个用可持久化线段树能够解决 排序自然不能直接排 既然是字符串 考虑Trie树+DFS就可以 注意字符串有反复的 小心 #include <vector> #include <cstdio> #include…
如果题目给出1e5的数据范围,,以前只会用n*log(n)的方法去想 今天学了一下两三种n*n*log(n)的数据结构 他们就是大名鼎鼎的 归并树 划分树 主席树,,,, 首先来说两个问题,,区间第k大 ,,,, 这个问题的通用算法是 划分树,, 说白一点就是把快速排序的中间结果存起来, 举个栗子 原数列 4 1 8 2 6 9 5 3 7 sorted 1 2 3 4 5 6 7 8 9 ........................... qs[0] 4 1 8 2 6 9 5 3 7 q…