
可持久化数据结构
bestFy
世界上最最最渣的oier.
展开
-
【Notes】【主席树】hdu2665 Kth number
题面在这里题目大意:给一个长为n的序列,m次询问,每次询问[l, r]内第k小的数是几。 n <= 100000, m <= 5000emmmm这题其实和poj2104一模一样的。不过poj的那题我用的是划分树,这题用一下主席树。(划分树是不支持修改的)主席树又名函数式线段树balabalabala....(关于主席树的简介包括名字来...原创 2017-11-27 23:49:36 · 18914 阅读 · 27 评论 -
bzoj4012: [HNOI2015]开店
题面在这里题意:给一棵树,每个点上有点权,边上有边权。 每次询问一个u,l,r,输出点权在[l,r]范围内的点到u的距离和。 强制在线。做法:考虑一棵树上所有点到一个点的距离和怎么求。 不难发现应该等于所有点的深度和+点数×u的深度-2×所有点与u的lca的深度和。 于是问题就在于求所有点与u的lca的深度和。 对于这个问题,我们可以先把每个点到根的路径都打标记,原创 2018-01-08 19:23:24 · 320 阅读 · 0 评论 -
bzoj3123: [Sdoi2013]森林
题面在这里题意:给一个森林,森林有n个节点m条边。 现在有两种操作: 1.Q x y k 表示询问x-y这条链上点权的第k小。保证x,y在同一个连通块里。 2.L x y 表示链接x,y两点。保证x,y在不同的连通块里。 要求强制在线,last表示上一次的答案,每次x,y,k都要异或last.初始为0.做法:权值第k小想到主席树。(发现和上一题基本一样除了连接两个点原创 2018-01-08 15:06:46 · 412 阅读 · 0 评论 -
bzoj3674: 可持久化并查集加强版
题面在这里题意:3种操作 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0做法:可持久化并查集,相当于每个时间建一棵线段树维护每个数的fa[]。 这题我用了按秩合并。这么理解,把并查集看成很多棵树,先不考虑路径压缩。 如果两个节点要合并,相当于把他们所在的两棵树合并。假定两个树的根节点为fx,fy原创 2017-12-29 14:31:35 · 271 阅读 · 0 评论 -
bzoj3673: 可持久化并查集 by zky
题面在这里题意:3种操作 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0做法:可持久化并查集,相当于每个时间建一棵线段树维护每个数的fa[]。代码:/************************************************************* Problem:原创 2017-12-29 12:55:37 · 333 阅读 · 0 评论 -
bzoj2741: 【FOTILE模拟赛】L
题面在这里题意:给一个数列,然后m个询问,每次询问一个区间[l,r]内异或值最大的数对,输出它们的异或值。做法:分块+可持久化trie。我们可以在log复杂度内求出,一个区间内任意一个数和一个定值的最大异或值。 可以用可持久化trie维护。 但是现在两个数都是不定的。考虑分块,f[i][j]表示第i个块左端点到j这段区间的数对的最大异或值。 则递推式为f[i][j] = max(f[i][j-原创 2017-12-28 17:34:53 · 308 阅读 · 0 评论 -
bzoj3772: 精神污染
题面在这里题意:给出一个树,共n个节点。 有m条互不相同的树上路径。 现在让你随机选择2条路径,问两条路径存在包含关系的概率(输出最简分数)。 n,m<=100000做法:假如我们把所有路径存下来,对于x,y的一条路,在x处打一个y标记,在y处打一个x标记,那么我们查询的时候,只要查询x,y两侧分别有多少标记就可以了,因为x,y两侧的点形成的路径肯定包含x-y。再说得明白一点,就是假如你对每个原创 2017-12-23 12:10:11 · 572 阅读 · 0 评论 -
bzoj2588: Spoj 10628. Count on a tree
题面在这里题意:给一棵树,多组询问,每次询问u,v路径上点权的第k小。做法:本题卡时间,只能带一个log。 考虑每个节点维护一个到根的权值线段树,查询x,y的路径上的和就是sum[x]+sum[y]-sum[lca(x,y)]-sum[fa[lca(x,y)]]。 于是每次只要把4个数传进参数里。qwq不用二分。另外这题可以树链+二分+树套树,log^4,不过会T.代码:/***********原创 2017-12-26 08:39:46 · 234 阅读 · 0 评论 -
bzoj3261: 最大异或和
题面在这里题意:一个非负整数序列,两个操作: 1.添加一个数到序列最后 2.询问l,r,x,要找到在[l,r]之间一个p使得x^a[p]^a[p+1]^..^a[n]最大。做法:记s[i]为前缀异或值,则x^a[p]^..^a[n]=x^s[n]^s[p-1]; 观察到x^s[n]为定值,所以只需要求[l,r]内和x^s[n]最大的s[p-1]。 用可持久化trie维护。代码:/******原创 2017-12-26 15:36:00 · 277 阅读 · 0 评论 -
CC FIBTREE Fibonacci Numbers on Tree
题面在这里题意:给一棵树,有4种操作: 1.询问以x为根时y子树内的点权和。 2.询问x~y链上的点权和。 3.将x~y这条链展开,第i个点加上fibifib_i,其中fibifib_i表示斐波那契第i项,fib1=fib2=1fib_1 = fib_2 = 1。 4.恢复到第x个操作时的状态。 本题强制在线。做法:首先fibi=15√×((1+5√2)i−(1−原创 2017-12-28 11:28:34 · 337 阅读 · 0 评论