主席树
sunyutian1998
这个作者很懒,什么都没留下…
展开
-
旅行 HYSBZ - 3531
https://www.lydsy.com/JudgeOnline/problem.php?id=3531树剖加主席树问一条链上某种颜色的权值和或最大值可以对每种颜色建立一棵线段树 维护树剖之后的dfs序列 每次在对应颜色的线段树上操作 但是这样空间复杂度无法承受 而用主席树的话 树图上的每一个节点都只需新开辟一条链这个方法同样可以简化(不用维护树剖)到查询一棵子树上某种颜色的数量...原创 2018-08-11 21:06:58 · 181 阅读 · 0 评论 -
动态逆序对 HYSBZ - 3295
https://www.lydsy.com/JudgeOnline/problem.php?id=3295给一个原始序列 每次删一个数 问删这个数之前有多少逆序对每个数从当前序列消失造成的影响就看 之前有多少数比当前数大 之后有多少数比当前数小 利用主席树做个前缀差即可 但是还有修改 所以要用动态主席树维护也可以用CDQ分治来做 首先逆向考虑(正向也可以) 整个过程就变为不断向数列内插...原创 2018-08-24 09:42:11 · 188 阅读 · 0 评论 -
dispatching HYSBZ - 2809
https://www.lydsy.com/JudgeOnline/problem.php?id=2809先求树图的dfs序 对dfs序列从前到后建立静态主席树 维护对应工资区间上有多少人枚举每个点 找到以该点为根的子树对应的区间 前缀和做差得到一棵线段树 区间二分查询 先看左子树工资上够不够 够就把人都算上再查右树 不够就从左树再递归还有要注意的是 离散化后不能去重 因为需要求人数 ...原创 2018-08-21 15:18:10 · 179 阅读 · 0 评论 -
Little Artem and Time Machine CodeForces - 669E
http://codeforces.com/problemset/problem/669/E动态主席树模板题CDQ分治也可以做 转换为三位偏序 初始给定顺序为第一维 t值为第二维 x值为第三维 代码略#include <bits/stdc++.h>using namespace std;struct node1{ int tp; int t; ...原创 2018-09-11 11:41:50 · 193 阅读 · 0 评论 -
Super Mario HDU - 4417
点击打开链接两种做法主席树模板题 对两个版本的线段树进行区间查询 然后做差即可#include <bits/stdc++.h>using namespace std;struct node{ int nl; int nr; int val;};map <int,int> mp;node tree[2000010];in...原创 2018-04-05 15:22:58 · 331 阅读 · 0 评论 -
Chef and Deforestation CodeChef - DEFOREST
https://www.codechef.com/problems/DEFOREST对于在xi处 高度为hi的一棵树 令hi-=xi 将问题转换为求h相同的两点之间有多少点的值大于h比如减完x后 高为h的树有p1 p2 p3...pk这几棵 在p1于p3之间连绳子相当于在p1p2之间 p2p3之间连绳子的加值之和 所以对于同一高度的树 就是个最大子段和问题 至于求h相同的两点之间有多少点的...原创 2018-10-07 18:26:00 · 237 阅读 · 0 评论 -
Couleur ZOJ - 4053
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4053已知一个区间的逆序数 将其分成两子区间后 分别求出两子区间的逆序数 可以想到只暴力求其中一边 根据贡献算出另一边 但是如果划分的位置正好是1 2 ... n可能退化为n^2 但是可以每次只暴力相对较小的那个区间 这样在最坏情况下也是logn的 后来知道这么搞叫启发式...原创 2018-10-29 15:54:01 · 164 阅读 · 0 评论 -
Vasya and a Tree CodeForces - 1076E
http://codeforces.com/contest/1076/problem/E这场竟然是acm赛制 本以为先做e能多捞几分 结果罚时爆炸还差点翻车。。m次修改 v k x代表将v节点之下k层的节点全都加x 最后统一查询 即输出每个节点的值因为修改过程无查询 考虑离线做法 因为是按层更新 一开始考虑维护bfs序 但k不是一个小常数 并且也无法对层数差分 只能换思路很多数据结...原创 2018-11-13 09:46:51 · 460 阅读 · 0 评论 -
Katya and Segments Sets CodeForces - 1080F
http://codeforces.com/contest/1080/problem/F离线处理加主席树离线处理解决线段包含问题 主席树是解决对连续集合的查询先对线段左端点升序排序每个版本的线段树维护每个集合中出现过的线段里右端点的最大值这样查询[x,y]时 就看包含了所有左端点li>=x的线段的版本的线段树 在[a,b]区间内的最大值是不是小于等于y即可他妈的交...原创 2018-11-24 19:04:59 · 319 阅读 · 0 评论 -
Two permutations CodeForces - 323C
http://codeforces.com/problemset/problem/323/C主席树裸题 对于第i个版本的线段树 a[i]在b序列中什么位置出现 就在那个位置加一 #include <bits/stdc++.h>using namespace std;const int maxn=2e6+10;struct node{ int l,r...原创 2018-11-30 20:57:42 · 198 阅读 · 0 评论 -
公共祖先 51Nod - 1681
https://www.51nod.com/Challenge/Problem.html#!#problemId=1681给两棵树 问对于每对顶点 有多少除这两个点之外的点 在这两棵树上都是这两个点的公共祖先考虑每个点的贡献 对于一个点 其子树在两棵树上的有两个dfs序 就看这两个序列有多少数是相同的 C(n,2)一下即可至于查询两个序列的两个区间有所少数是相同的 主席树搞一下就行 这...原创 2018-12-07 14:56:55 · 206 阅读 · 0 评论 -
Prefix HDU - 5790
http://acm.hdu.edu.cn/showproblem.php?pid=5790查询区间内不同字符串前缀数量 且字符串总长度不超1e5 可以想到主席树在线或线段树离线 又因为题目强制在线 所以主席树搞一搞 具体就是把一个长度为l的字符串中每一个前缀都哈希为一个数 总共l个数 这样查询多少不同字符串就转换为查询多少不同数#include <cstdio>#incl...原创 2018-08-23 00:46:55 · 133 阅读 · 0 评论 -
Jewel HDU - 3727
http://acm.hdu.edu.cn/showproblem.php?pid=3727乍一看有insert 以为是伸展树 还要求第k大 直接懵逼..但是并没有查询 所以序列顺序是不变的 直接离线 把所有insert的值都记下来 建立主席树 然后1和3是静态区间第k大 2是问某个数第几大#include <bits/stdc++.h>using namespace ...原创 2018-08-22 23:30:14 · 168 阅读 · 0 评论 -
Boredom CodeForces - 854E
http://codeforces.com/problemset/problem/854/E和图形学的剪切算法有些相通之处对每一次查询 将整个n*n的平面划分为9个区域 其中5是题目查询的区间1 2 34 5 67 8 9对于1区中的点 在5 6 8 9中出现的点对于1区中点结合 对答案构成贡献对于2区中的点 在4 5 6 7 8 9中出现的点对于2区中点结合 对答案构...原创 2018-08-22 21:11:35 · 336 阅读 · 0 评论 -
Sequence II HDU - 5919
http://acm.hdu.edu.cn/showproblem.php?pid=5919题意 求给定一个区间 内有k个不同的数 把它们第一次出现的位置升序排序 问第(k+1)/2个数的下标首先要找出区间内多少不同数 并且没有修改 用静态主席树维护主席树查询区间不同数一般就是两种方法法一https://blog.csdn.net/sunyutian1998/article/det...原创 2018-08-11 00:59:36 · 222 阅读 · 0 评论 -
Dynamic len(set(a[L:R])) UVA - 12345
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3767动态查询区间内有多少不同颜色用set维护每种颜色出现的位置 set每次插入或擦除后仍满足单调性对于[l,r]区间内有多少不同颜色 就看有多少位置i 其上颜色clr[...原创 2018-07-28 09:37:04 · 525 阅读 · 0 评论 -
口算训练 HDU - 6287
http://acm.hdu.edu.cn/showproblem.php?pid=6287这题本来可以用二维数组搞一个所有数的质因子及其次幂的前缀和 然后每次线性枚举一遍素因子 但是空间爆炸 用主席树的话每次只需更新几条链 牺牲了时间复杂度 增加了一个log 虽然这样用主席树空间耗费也大 但是题目时空限制都很松#include <cstdio>#include <v...原创 2018-07-17 18:58:02 · 236 阅读 · 0 评论 -
Just h-index HDU - 6278
点击打开链接对每次询问 找出最大的h 使[l,r]区间内有至少h个数大于等于h 明显有单调性 二分h值即可#include <bits/stdc++.h>using namespace std;struct node{ int l; int r; int val;};node tree[2000010];int ary[100010],...原创 2018-07-15 09:30:48 · 198 阅读 · 0 评论 -
Dynamic Rankings ZOJ - 2112
点击打开链接动态主席树模板 推荐博客点击打开链接先用原序列的n个数建立一个静态主席树 再利用树状数组维护一个动态主席树 每次查询利用静态与动态之和 而更改只改动态主席树 即在取lowbit过程中把每个遍历到的位置对应的线段树更新一条链这里的区间查询另开了一个use数组 因为这种区间二分查询 需要静态和动态主席树的加和来决定下一步走向虽说树状数组可以解决的问题线段树都能解决 但是在这...原创 2018-05-17 14:41:09 · 283 阅读 · 0 评论 -
百度科学家(简单)(中等)(困难)
困难版 题意有些绕 这就不说了 一个点对一个连续区间内的所有点连一条权值相同的边 这个线性的过程可以用线段树来优化但是这道题中每个位置上的元素会改变 这样只用线段树是无法维护的 需要用主席树来维护 这也没啥好说的 学了主席树其中道理自然明白 然后就是tarjan缩点后贪心 找出度为零的强连通分量加和的最小值直接上代码 #include <bits/...原创 2018-05-12 21:26:52 · 591 阅读 · 4 评论 -
To the moon HDU - 4348
点击打开链接主席树区间更新模板对于主席树中的每一颗线段树 除了左右区间的位置与父区间不再有任何关系以外 其他都是一模一样但是因为主席树中的线段树每一个区间和左右子区间的关系不好找 只能pushup 不能pushdown#include <cstdio>#include <cstring>#include <algorithm>using ...原创 2018-05-03 13:55:29 · 201 阅读 · 0 评论 -
D-query SPOJ - DQUERY
点击打开链接和hdu3333基本一样 两种方法主席树有时可看做是利用线段树做的一个前缀 但在这里并没有用到前缀和的性质 和线段树离线做法有些类似 都是把同一个数出现的位置尽量提前#include <bits/stdc++.h>using namespace std;struct node{ int nl; int nr; int val;...原创 2018-04-05 13:18:42 · 172 阅读 · 0 评论 -
K-th Number POJ - 2104
点击打开链接第一次写主席树 存模板推荐一个学长的博客 有图就是好理解 点击打开链接#include <cstdio>#include <map>#include <cstring>#include <algorithm>using namespace std;struct node{ int l; int ...原创 2018-04-04 20:00:15 · 166 阅读 · 0 评论 -
middle HYSBZ - 2653
https://www.lydsy.com/JudgeOnline/problem.php?id=2653根据题目要求 左端点在[a,b]中 右端点在[c,d]中 那[b+1,c-1]中的数是必须都要选的 而[a,b]中需再选一个右连续段 [c,d]中选一个左连续段将给定序列排序 然后建立主席树 初始每个点都为1 第i棵线段树在第i-1棵基础上 把排序后的第i-1个数对应位置置为-1这...原创 2018-08-13 21:29:40 · 207 阅读 · 0 评论 -
A Heap of Heaps CodeForces - 538F
http://codeforces.com/problemset/problem/538/F一开始能想到的只有暴力查询 打了个表发现即使n达到2e5时 需要查询的次数也只是2e6左右 所以找每个节点在k叉时对应的子节点区间有多少节点比当前节点要小 主席树维护一下即可但是想想 其实还可以用线段树离线处理 先把查询拿出来按所查询的权值排序 然后对于每个查询 把所有小于该查询值的序列元素都更新到...原创 2018-08-22 10:05:11 · 197 阅读 · 0 评论 -
Turing Tree HDU - 3333
点击打开链接两种做法线段树离线处理将查询区间右端点升序排序 然后依次遍历每个数的值只体现在已经遍历过的序列范围内最靠右的位置 用map记录数的位置 线段树更新和查询#include <bits/stdc++.h>using namespace std;#define ll long longstruct node1{ ll ans; ...原创 2018-02-12 10:15:07 · 175 阅读 · 0 评论