可持久化线段树
gjghfd
这个作者很懒,什么都没留下…
展开
-
bzoj2809 [ APIO2012 ] -- 主席树
先求出dfs序,然后枚举管理者。 由于只要求数量最多,所以薪水一定从小到大取,用主席树维护,每次在主席树上二分就可以了。 具体看代码。 代码: 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 100010 8 #define ll long l原创 2017-05-26 16:45:27 · 265 阅读 · 0 评论 -
[ 网络流 主席树 ] BZOJ3218
将答案转化为 ∑(wi+bi)−∑whitebi−∑blackwi−∑strangepi\sum(w_i+b_i)-\sum_{white}b_i-\sum_{black}w_i-\sum_{strange}p_i 然后就是和bzoj3681一样的套路。#include<cstdio> #include<cstring> #include<iostream> #include<algorithm原创 2017-10-13 08:28:04 · 383 阅读 · 1 评论 -
[ 网络流 树上启发式合并 主席树 ] BZOJ3681
题解#include<bits/stdc++.h> using namespace std; inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++; } inline void原创 2017-10-11 21:37:03 · 401 阅读 · 0 评论 -
Codechef Aug2017 #Walks on the binary tree -- 主席树+Hash
传送门每次答案增加的值就是 nn - 之前出现的数与 XX 的 LCPLCP 最大值。 而与 XX 的 LCPLCP 最大的点在 dfsdfs 序上与 XX 的距离最近。而在满二叉树上 XX 在 dfsdfs 上的位置就等于 XX 。 于是可以用 setset 维护所有出现过的点,加入 XX 时找 XX 两边最近的点更新答案。 每个点用主席树+hash维护。代码#include<set> #i原创 2017-08-29 16:51:53 · 379 阅读 · 0 评论 -
Codechef June Challenge 2017 #Persistent oak -- 树链剖分+主席树
传送门每个点维护一下还能承受多少重量,线段树维护区间最小值就可以了。 如果一个子树全部折断,可以直接把初始版本的主席树接过来。代码:#include<cstdio> #include<vector> #include<cstring> #include<iostream> #include<algorithm> using namespace std; inline char nc(){原创 2017-09-15 20:50:28 · 336 阅读 · 0 评论 -
codeforces840D Destiny -- 可持久化线段树
%%%Vectorxj 对于询问(l,r,k)(l,r,k),令p=l+rkp={l+r\over k}。假如将这个区间排序,那么对于这个区间所有出现次数大于 pp 的数,它一定在 p,2p⋯kpp,2p\cdots kp 出现过。于是只要用主席树求出区间第 p,2p⋯kpp,2p\cdots kp 大,再判断一下出现次数是否大于 pp 就可以了。代码#include <cstdio> #incl原创 2017-08-20 17:19:38 · 772 阅读 · 1 评论 -
SnackDown 2017 Online Elimination Round #Prefix Xor -- 主席树
传送门题目大意:给你 nn 个数,每个数的值是 aia_i ,定义数对 (i,j)(i,j) 是上升的当且仅当 ai≤ai xor ai+1≤ai xor ai+1 xor ai+2≤⋯≤ai xor ai+1 xor ai+2⋯xor aja_i\leq a_i ~\text{xor}~a_{i+1}\leq a_i ~\text{xor}~a_{i+1}~\text{xor}~a_{i+2}原创 2017-08-01 19:10:01 · 355 阅读 · 0 评论 -
bzoj2588 -- 树链剖分+主席树
先将权值离散。 显然可以对于每个结点建一棵权值线段树存这个点到根结点的路径上的点权,询问时在线段树上二分,但这样时间是O(n2log2n)的。 然后想到用主席树优化,时间复杂度O(n*log2n)。 代码: 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #defi原创 2017-05-26 16:45:47 · 576 阅读 · 0 评论 -
codeforces464E The Classic Problem -- 最短路+主席树+Hash
题目大意:求ss到tt的最短路,边权为2xi,xi≤1052^{x_i},x_i\leq10^5。看Manchery的题解就可以了。原创 2017-07-06 16:59:19 · 534 阅读 · 0 评论 -
bzoj3489 -- 可持久化树套树
令lastilast_i表示aia_i前一个出现的位置(没出现过为00),nextinext_i表示aia_i后一个出现的位置(没出现过为n+1n+1)。 那么要满足的条件是:lasti<l,nexti>r,l≤i≤r last_i<l,next_i>r,l \leq i\leq r 将aia_i按lastilast_i排序,对nextinext_i建一棵主席树,每一个节点存一个线段树记录区间内原创 2017-07-04 17:14:10 · 465 阅读 · 0 评论 -
bzoj1901 [ Zju2112 ] --树状数组套主席树
树状数组套主席树模板题。。。 题目大意: 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是多少(1≤k≤j-i+1),并且,你可以改变一些a[i]的值,改变后,程序还能针对改变后的a继续回答上面的问题。你需要编一个这样的程序,从输入文件中读入序列a,然后读入一系列的指令,原创 2017-05-26 16:41:15 · 238 阅读 · 0 评论 -
bzoj2653 -- 二分+主席树
对于每一个询问二分答案。 设当前答案为x,将>=x的数的权值设为1, 当 [b+1,c-1]的权值和+[a,b]权值和最大的后缀+[c,d]权值和最大的前缀>=0时x可行。 先对每个数离散,然后以每个值建立主席树记录区间和、最大前缀、最大后缀就可以了。 时间复杂度:O(n*log3n) 代码: 1 #include 2 #include 3 #include 4 #include原创 2017-05-26 16:45:12 · 242 阅读 · 0 评论 -
bzoj3932 [ CQOI2015 ] --可持久化线段树
题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分。超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第Ei秒后结束(第Si秒和Ei秒任务也在运行 ),其优先级为Pi。同一时间可能有多个任务同时执行,它们的优先级可能相同,也可能不同。调度系统会经常向 查询系统询问,第Xi秒正在运行的任务中,优先级最小的原创 2017-05-26 16:41:05 · 208 阅读 · 0 评论 -
bzoj3207--Hash+主席树
题目大意: 给定一个n个数的序列和m个询问(n,m 思路:把所有连续的k个数字hash一下,然后扔进主席树,询问时在主席树中查询就可以了。 注意(坑)点:1、hash值要用unsigned long long存 2、如果直接求l+r>>1会爆,所以要改成(l>>1)+(r>>1)+(l&r&1) 3、Yes和No是反的。。。 代码: 1 #include 2 #include 3 #in原创 2017-05-26 16:41:20 · 175 阅读 · 0 评论 -
bzoj4771 -- dfs序+倍增+主席树
先考虑没有深度限制的情况。 先将每个节点的权值设为1,对于颜色相同且在dfs序中最近的2个点,用倍增求出lca并将它的权值减一。然后子树中不同的颜色种数就是子树的权值和了。 有深度限制时,考虑以深度为时间建立主席树。 将每个点按深度排序,枚举一遍。对每种颜色开一个set,枚举到一个点时将它在dfs序中的位置加入set中并更新就可以了。 时间复杂度O(T*(nlogn+mlogn)) 代码:原创 2017-05-26 16:43:27 · 326 阅读 · 0 评论 -
[ 主席树 ] BZOJ4299
先考虑如何求出一个集合的答案。 将所有数从小到大加入。 假设当前已经可以构造出 [1,mx][1,mx] 的所有数,然后加入一个数 xx 。 当 x>mx+1x>mx+1 时,mx+1mx+1 就是答案。 当 x≤mx+1x\le mx+1 时,mxmx 会加上 xx 。 于是建一棵主席树,对于一个询问,每次求出 [1,mx+1][1,mx+1] 的数的和更新 mxmx ,直到不满足条件原创 2018-01-22 18:43:31 · 254 阅读 · 0 评论