可持久化数据结构
LowestJN
强省弱OIer
展开
-
[BZOJ2509][主席树]送分题
题意给出平面上的M条平行于坐标轴的线段,问有多少个正方形。这题其实可以O(n3)O(n^3)暴力10秒卡过去…… 对于一个点(x,y)(x,y),因为线段都是垂直于坐标轴的,我们可以计算出通过它的线段的四个端点。又因为每条线段没有重叠部分,所以可以用类似并查集的方法O(n2)O(n^2)处理出来。那么暴力就是枚举每个点作为正方形的一个端点,然后枚举正方形的边长再判断。可以把平面分成2n2n条对角线原创 2016-12-13 19:14:50 · 611 阅读 · 0 评论 -
[dfs序 主席树] HackerRank University CodeSprint 3. Simple Tree Counting
Hillan大佬神奇的idea求出树的dfs序,只要能处理加边和删边操作就行了令加入的边为 (x,y)" role="presentation">(x,y)(x,y)(x,y),不妨设 x" role="presentation">xxx 是 y" role="presentation">yyy 的父亲,令 z" role="presentation">zzz 为 x" role="pre原创 2018-01-26 16:08:53 · 365 阅读 · 0 评论 -
[主席树 链剖] LOJ#6073. 「2017 山东一轮集训 Day5」距离
刚开始想了一个很naive的分块加虚树的做法,不管时空复杂度还是代码复杂度都巨大可以把问题转发成求 ∑i∈path(u,root)dis(pi,k)\sum_{i\in path(u,root)}dis(p_i,k)再推一下式子就得到 ans=∑i∈path(u,root)dis(pi)+depthu×dis(k)−2∑i∈path(u,root)dis(lca(i,k))ans=\sum原创 2018-01-18 09:58:56 · 518 阅读 · 0 评论 -
[(可持久化)字典树 优化建图][2-SAT] LOJ#6036. && 雅礼集训 2017 Day4. 编码
老早以前的坑了 貌似好多地方都有这个题 因为每个串都只有一个问号,问号可取0可取1,这就是一个经典的2-SAT模型 但是直接做的话,边数是n2n^2级别的,不过因为是01串,可以用可持久化字典树优化建图(可能也可以不可持久化,但是我觉得可持久化比较方便)#include <cstdio>#include <iostream>#include <algorithm>#include <st原创 2017-07-13 17:05:33 · 857 阅读 · 0 评论 -
[k短路 && 可持久化堆]HDU5960.Subsequence
如果只求最大价值,显然可以DP fi,jf_{i,j} 表示前 ii 个点,最后一个点的颜色是 jj 的最大价值但是要求第k大的 把每个状态建成点,转移建成边,那么就构成一张图 求第k大就直接套可持久化堆的k短路算法就好了#include <cstdio>#include <iostream>#include <algorithm>#include <queue>#define fi原创 2017-09-27 13:35:33 · 996 阅读 · 0 评论 -
[LCT && 主席树] BZOJ3514 .Codechef MARCH14 GERALD07 加强版
挺套路的题 如果我们对所有联通块取一棵生成树 那么联通块个数是点数减去边数(因为一棵树的点数-边数=1) 那么题目就是求这个区间里的边构成的图的生成树的边数以加入的时间为权值,用LCT维护最大生成树,如果一条边加入图中会形成环,那么肯定要把这两点间的最小边删去后再加入边,设最小边权为k,那么就是要把1~k的边都删去后这条边才会存在在生成树上。 用主席树维护和查询就好了#include <cs原创 2017-09-18 21:39:15 · 520 阅读 · 0 评论 -
[BZOJ4923][Lydsy六月份月赛 .G][平衡树]K小值查询
直接上题解 学了发非旋转Treap,感觉常数有点大#include <cstdio>#include <iostream>#include <algorithm>using namespace std;const int N=100010;int n,m;int a[N];struct node{ node *l,*r; int val,fix,size,minus; node(原创 2017-06-29 19:18:22 · 1024 阅读 · 0 评论 -
[主席树维护HASH] Codechef. Cloning
传送门直接用主席树维护HASH比较就可以了吧…#include <cstdio>#include <algorithm>#include <iostream>using namespace std;typedef unsigned long long ll;const int N=100010;const ll base=100003;int t,n,q,cnt;int a[N],rt[N]原创 2017-08-29 11:23:51 · 409 阅读 · 0 评论 -
[主席树维护HASH && SET维护DFS序] Codechef. Walks on the binary tree
传送门每次加一个串 x 会增加 n-max{LCP(x,i)},因为是树上,max{LCP(x,i)}就肯定是dfs序中跟它相邻的点,也就是它们的lca深度最深。 那么就用set维护一下dfs序,比较的话,用主席树维护hash#include <cstdio>#include <iostream>#include <algorithm>#include <set>#include <cst原创 2017-08-29 11:22:11 · 430 阅读 · 0 评论 -
[最短路 && 主席树维护HASH] 51nod1863 Travel
把一条路径上的点值按排名顺序排序,那么路径的优劣就是字典序。相当于是求一条字典序最大的路径。 最长路然后就是老套路,用主席树来维护hash,就可以在O(log)的时间里比较两个串的字典序,然后就套最短路就可以了用对优化的DIJ复杂度就是O((N+M)lognlogn)O((N+M)\log n\log n)#include <cstdio>#include <iostream>#include原创 2017-08-29 11:13:14 · 766 阅读 · 0 评论 -
[最短路 && 主席树维护HASH]Codeforces 464E. The Classic Problem
传送门 老套路 跟51nod1863一样。 就是多了进位#include <cstdio>#include <iostream>#include <algorithm>#include <set>#include <cstring>#include <string>#include <vector>#include <queue>#include <assert.h>#def原创 2017-08-29 11:16:46 · 468 阅读 · 0 评论 -
[主席树] Codeforces 840D .Destiny
%%%Vectorxj 设答案为p=r−l+1kp={r-l+1\over k },如果把区间元素排序,那么答案一定是第p个、第2p个…第kp个元素中的一个。 因为答案出现次数大于p,一定会跨越一个边界,所以以上结论成立 那么就在主席树上二分出这些数,找出最小的满足条件的就可以了#include <cstdio>#include <iostream>#include <algorithm>原创 2017-08-20 17:18:33 · 1285 阅读 · 0 评论 -
[线段树 || 主席树][Hash] HackerRank 101 Hack 49. Sorting Lists
传送门这题有两种做法考场上写了逐位确定的方法,但是没时间调了就交了暴力…先考虑区间1,如果里面不同的方案数小于k,那么任何一个1为前缀的序列都不是答案,否则1一定是答案的前缀,然后考虑2…可以用hash判重来记录一个区间里的方案数。#include <cstdio>#include <iostream>#include <algorithm>#include <ctime>#include原创 2017-07-08 21:15:53 · 532 阅读 · 0 评论 -
[BZOJ4504][主席树]K个串
只区间出现一次的数就是上一次出现在位置在区间外的数,这个可以用主席树实现,然后套用超级钢琴的思想就可以了。#include <cstdio>#include <iostream>#include <algorithm>#include <map>#include <queue>using namespace std;const int N=100010;typedef long long l原创 2017-07-04 17:48:46 · 582 阅读 · 0 评论 -
[BZOJ Contest-2017省队十连测推广赛2·T2][BZOJ4771][主席树][dfs序]七彩树
%%%Manchery先考虑没有深度限制,要计算子树中不同的颜色的个数,就令所有节点的初始权值为1,就把两两相同颜色的节点的LCA的权值-1,然后求一遍子树权值和就可以了。 但是这样做复杂度是O(n2)O(n^2),而且会在某个节点多次-1。其实只要把颜色相同的节点提出来,按照dfs序的标号排个序,然后在相邻的节点的LCA处-1就行了。然后考虑有深度限制,仔细想想发现这个限制特别像主席树,那么就以原创 2017-03-11 09:06:58 · 1267 阅读 · 0 评论 -
[主席树优化建图] LOJ#546. 「LibreOJ β Round #7」网格图
最简单的思路是离散化后 O(k2)O(k2)O(k^2) 搞然而对于横着的朝向,极长的横着相连的格子的答案是相同的,竖着的同理那么把极长的相连的格子也缩起来,用主席树优化建图,就可以 O(klogk)O(klogk)O(k\log k) 最短路了#include <cstdio>#include <iostream>#include <algorit...原创 2018-02-25 21:17:16 · 586 阅读 · 0 评论