![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构-主席树
文章平均质量分 57
_lifehappy_
这个作者很懒,什么都没留下…
展开
-
H - Hello Ms. Ze(树状数组套主席树,线段树上二分)
H - Hello Ms. Ze给定nnn种不同的材料,第iii种材料有aia_iai个,有mmm个操作,操作分为两类:把第xxx种材料修改为yyy个,只用[l,r][l, r][l,r]区间的材料制作衣服,每件衣服要用kkk个不同的材料,最多能做多少件,先不考虑修改操作,对于区间[l,r][l, r][l,r]中的原料,我们可以做最多多少衣服,如何求解,考虑二分答案,假设我们可以最多做xxx件衣服,显然对于个数大于等于xxx的材料,在每件衣服中我们只能使用一次,假设我们当前二分的区间为[原创 2021-04-06 14:07:50 · 269 阅读 · 0 评论 -
P4602 [CTSC2018]混合果汁(主席树)
P4602 [CTSC2018]混合果汁共有nnn种果汁,第iii种果汁的美味度为did_idi,每升价格为pip_ipi,在一瓶混合果汁中,最多只能添加lil_ili升。有mmm个询问,每次询问给出两个数g,Lg, Lg,L,我们要找出价格不大于ggg,体积不小于LLL的混合果汁的最大美味度。混合果汁的美味度为所有参与混合的果汁的最小值,如果没有满足条件的混合果汁则输出−1-1−1。把果汁按照美味度排一个序,对每个询问二分枚举did_idi,然后judge[i,n][i, n][i,n]上原创 2021-04-02 21:34:39 · 280 阅读 · 0 评论 -
#6073. 「2017 山东一轮集训 Day5」距离(树链剖分 + 永久标记主席树)
#6073. 「2017 山东一轮集训 Day5」距离给定一颗有nnn个节点带边权的树,以及一个排列ppp,path(u,v)path(u, v)path(u,v)为u,vu, vu,v路径上的点集,dist(u,v)dist(u, v)dist(u,v)为u,vu, vu,v之间的最短路的长度。有mmm次询问,每次给定u,v,ku, v, ku,v,k,要求∑i∈path(u,v)dist(pi,k)\sum\limits_{i \in path(u, v)}dist(p_i, k)i∈path(u,原创 2021-03-27 14:01:57 · 245 阅读 · 0 评论 -
P4211 [LNOI2014]LCA(离线 + 在线 做法)
P4211 [LNOI2014]LCA有一棵根节点为111树,有mmm次询问,每次给定l,r,zl, r, zl,r,z,输出∑i=lrdep[lca(i,z)]\sum\limits_{i = l} ^{r} dep[lca(i, z)]i=l∑rdep[lca(i,z)]。乍一看这题好像无从下手,仔细想想lca(i,z)lca(i, z)lca(i,z)有何性质,不难发现lca(i,z)lca(i, z)lca(i,z)一定是在1−>z1->z1−>z的路径上的,那么我们的答案原创 2021-03-25 22:22:46 · 238 阅读 · 0 评论 -
牛客练习赛71 F 红蓝图(kruskal重构树)
红蓝图给定两个参数x,tx, tx,t,删除边权大于ttt的红边,和边权小于ttt的蓝边,问对于所有的点yyy,既能通过红边走向xxx,又能通过蓝边走向xxx,的点有多少个。考虑对红边按照边权升序建立一颗kruskalkruskalkruskal重构树,对蓝边按照边权降序建立一颗kruskalkruskalkruskal重构树,在树一中我们向上跳,找到点权小于等于ttt的深度最浅的点uuu,同理在树二上我们向上跳,找到点权大于等于ttt的深度最浅的点vvv,最后我们只需要判断,这两个点所代表的子树集原创 2021-03-11 17:45:23 · 241 阅读 · 0 评论 -
P4899 [IOI2018] werewolf 狼人(kruskal 重构树 + 主席树)
P4899 [IOI2018] werewolf 狼人给定一个有nnn个点mmm条边的无向图,有QQQ个询问每次输入S,E,L,RS, E, L, RS,E,L,R,表示你在SSS点出发,要到EEE点,且初始时你是人形态,你只能走[L,n][L, n][L,n]的点,但是我们要以狼的形态走到终点,这个时候只能走[1,R][1, R][1,R]之间的点,也就是说我们要在[L,R][L, R][L,R]的某个点变身,问能否从S−>ES->ES−>E。一个比较容易想到的做法:显然,初原创 2021-03-09 17:51:21 · 2500 阅读 · 0 评论 -
#3551. [ONTAK2010]Peaks加强版(kruskal 重构树 + 主席树)
#3551. [ONTAK2010]Peaks加强版我们要求从一个点出发经过困难值小于等于xxx的路径所能到达的山峰中第kkk高的是什么。考虑按照边权升序,建议kruskalkruskalkruskal重构树,然后倍增向上跳,找到困难值小于等于xxx的深度最小的节点uuu,那么我们只要在uuu的子树中询问第kkk大即可,所以可以用主席树来写,依照dfsdfsdfs序,对每个节点建立一颗主席树,然后在主席树上查找第kkk大即可。#include <bits/stdc++.h>using原创 2021-03-07 21:18:13 · 280 阅读 · 1 评论 -
几道偏序问题(数据结构)
P3157 [CQOI2011]动态逆序对#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 1e5 + 10;int root[N], ls[N << 8], rs[N << 8], sum[N << 8], cnt;int n, m, pos[N];inline int lowbit(int x) { return x &原创 2021-02-23 20:47:00 · 302 阅读 · 0 评论 -
HDU 6703 array(主席树 + set)
array给一个全排列,接下来有两种操作:一、把pospospos位置上的值+10,000,000+10,000,000+10,000,000。二、查询[1,r][1, r][1,r]区间,没有出现的且≥k\geq k≥k的最小值是多少。考虑用主席树 + set 求解,先建立一颗主席树,每个叶节点的权值为其所代表的区间(一个点)的值,然后维护区间最小值即可。然后权值插入,每次把这个点的权值跟新为infinfinf,这一步也可以理解为,在这个区间出现的数就是infinfinf了,所以我们只要查询原创 2021-02-20 15:24:49 · 229 阅读 · 0 评论 -
ICPC 徐州 H Yuuki and a problem (树状数组套主席树)
Yuuki and a problem先不管第一问的修改操作,考虑如何达到第二问的查询操作,题目要我们给出一个区间[l,r][l, r][l,r]中,不能通过权值+++得到的最小的数字是什么,假设我们已经可以得到[1,x][1, x][1,x]之间的数了,且,我们询问权值在[1,x+1][1, x + 1][1,x+1]之间的和为sumsumsum,那么[1,sum][1, sum][1,sum]之间的数一定能通过+++法得到,我们分类讨论一下:sum=sumxsum = sum_xsum=su原创 2021-02-10 19:53:35 · 384 阅读 · 0 评论 -
主席树有关的一些题目(持续更新)
主席树模板P3919 【模板】可持久化线段树 1(可持久化数组)#include <bits/stdc++.h>using namespace std;const int N = 1e6 + 10;int root[N], n, m;int ls[N * 25], rs[N * 25], value[N * 25], tot;void build(int &rt, int l, int r) { rt = ++tot; if (l == r) {原创 2021-02-09 20:45:06 · 317 阅读 · 0 评论 -
#279. [SYZOI Round1] 滑稽♂树(树状数组套主席树)
#279. [SYZOI Round1] 滑稽♂树子树上的问题,考虑dfsdfsdfs序,第kkk大,可以用主席树嘛,支持修改,那就树状数组上套主席树,参考P4175 [CTSC2008]网络管理(树状数组套主席树)#include <bits/stdc++.h>using namespace std;const int N = 3e4 + 10, maxn = 10000;int head[N], to[N << 1], nex[N << 1], cnt原创 2021-02-09 20:43:45 · 213 阅读 · 0 评论 -
P4175 [CTSC2008]网络管理(树状数组套主席树)
P4175 [CTSC2008]网络管理每次询问两点间的第kkk大,考虑建立nnn棵主席树,每棵主席树记录的是从根节点到当前节点的状态,由于主席树是一种类似前缀和的数据结构,可以使用差分的方式得到(u,v)(u, v)(u,v)点对之间的主席树为u+v−lca(u,v)−fa(lca(u,v))u + v - lca(u, v) - fa(lca(u, v))u+v−lca(u,v)−fa(lca(u,v)),即这一段路径上的信息可用这四棵主席树加减得到,但是这样只能处理静态问题,这里还增加了修改操作原创 2021-02-09 20:39:35 · 226 阅读 · 0 评论 -
Sequence II (HDU 5919)(主席树)
Sequence II题目大意是有mmm次询问,每次询问一段区间[l,r][l, r][l,r],从左到右,如果这个数是在这个区间第一次出现,则记录下其下标,我们会得到一个新的数组,要求这个数组的中位数是什么。考虑使用主席树来写,我们倒序插入这些数的信息并记录下这个数上一次是出现在哪,对于每个点我们将其下标在主席树中+1+1+1,然后对于上一次出现的下标,在主席树中−1-1−1,所以我们直接在第lll棵主席树中查询区间[l,r][l, r][l,r]的权值即是这个区间的不同数字个数,在这个区间里,对于原创 2021-02-09 20:25:15 · 328 阅读 · 0 评论