随笔分类 - 权值线段树+主席树
摘要:我们不以权值建立主席树,而是区间端点作为值建立线段树,一个个插入a[i],我们发现这个数之前是存在的,就需要在上个版本的主席树上减去原来的位置,并加上现在的位置,这样我们在i版本的主席树,维护1-r中,所有数最后一次出现的位置,然后实现区间查询,即可。
阅读全文
摘要:A对于知道了解主席树性质的人来说,的确算是一个模板题目 题目在于给一个螺旋矩阵,以及一些权值,问在二维区间内权值和是多少? 对于螺旋矩阵权值来说,计算每个点的值,只需要O1计算即可。我们可以通过计算内部圈数得到计算外围的权值,再加当前圈数即可 而对于二维的区间和,我们知道其实主席树已经是二维的了,因
阅读全文
摘要:最近疯狂练习线段树。。。 这道题题意很简单,在1-n中,找寻一个数,使得去掉这个数后,对于每个位置中满足 1<=j<i && a[ j ]<a[ i ] 的位置尽可能多。 我们考虑对于每个位置i的贡献,如果当前位置已经满足条件,那么前面任何数的删除,对这个位置实际上是没有贡献的,并且对于当前位置来说
阅读全文
摘要:这题非常好!!! 主席树版本 很简单的题目,给一个按照指定节点的树,树上有点权,你需要回答给定节点的子树中,和其距离不超过k的节点中,权值最小的。 肯定首先一想,按照dfs序列建树,然后按照深度为下标,建立主席树,那么我们通过主席树相间得到区间状态,但是很不幸,区间最值不能通过减去历史版本的主席树得
阅读全文
摘要:简单分析一下,对于x<y,求a[x]>=y 同时a[y]>=x 再简化一下,求1-a[y]区间内大于>=y的个数。。。主席树牛逼
阅读全文
摘要:这题是真的秀。。。我服了。。。线段树用好了,感觉什么都可以写。。。 题目大意:给你一个串,问满足以下条件的子串中最长的是多长:对于每个数字,要么在这个子串没出现过,要么出现次数超过k次。 我们对于每一个位置i,肯定希望往左找到最远满足条件的,然后维护一个最大值,岂不美哉? 那么我们该如何找到最远满足
阅读全文
摘要:我TM真是一个弟弟。。。 题意: 给出一串1-N的数字 你每次可以把某个位置的值+1000000 或者找一个值,所有a[1]...a[r]序列的数都不能等于这个值,并且这个值>w 当时比赛觉得肯定是树套树,待修区间第K大,一想不会就自闭了。。。 其实反过来想,如果a[1]....a[r]序列的数都不
阅读全文
摘要:边权转点权,每次遍历到下一个点,把走个这条边的权值加入主席树中即可。
阅读全文
摘要:二分第x次砍的位置,然后用线段树查询小于这个位置的数的个数和值的和。然后判断即可 注意!!!主席树是通过动态开点实现的,本身已经不用再从1开始了,而本题开的范围也应该是0,100000 而不是1,100000(害得我找了很久的错误)
阅读全文
摘要:#include #include #include #include #include #define LL long long #define rep(i,j,k) for(int i=j;i=k;i--) #define pb push_back #define pii pair #define mp make_pair using namespace std; const int...
阅读全文
摘要:权值线段总结 权值线段树就是把线段树的每个点权,赋予一定的含义,比如数字出现的次数,数值前缀出现的次数,并用区间求和维护一个前缀信息,比如数字出现的次数,第K大等(不能实现区间第K大),前缀第K大等。 权值线段树优点: 能够比较容易实现平衡树的一系列操作 一个序列中,插入一个数,删除一个数,求值为数
阅读全文
摘要:要询问前K小的值之和,并且每个任务都是区间操作,单点修改,为了实现这个操作,我们可以利用差分数组进行实现。。。 在开始时刻a的位置上,加上任务的优先级,在b+1时刻的位置上,减去任务的优先级,再用主席树维护前缀和。。。然后就没有了
阅读全文
摘要:查询区间内部数字出现次数大于(r-l+1)/2的数字
阅读全文
摘要:#include #include #include #include #include #define rep(i,j,k) for(int i=j;i=k;i--) #define LL long long using namespace std; const int maxx = 3e5+6; struct node{ int l,r; LL val; }tree[maxx>1; ...
阅读全文
摘要:#include<iostream> #include<stdio.h> #include<algorithm> #include<string.h> #define rep(i,j,k) for(int i=j;i<=k;i++) #define per(i,j,k) for(int i=j;i>=k;i--) using namespace std; const int maxx = 2e5+
阅读全文
摘要:主席树的入门题目,这道题的题意其实就是说,给你一棵树,询问在两个节点之间的路径上的区间第K小 我们如何把树上问题转换为区间问题呢? 其实DFS就可以,我们按照DFS的顺序,对线段树进行建树,那么这个树上问题就可以转换为区间问题了, 那么如何询问来表示两个节点之间的路径呢? 其实也很简单,可以看看以下
阅读全文

浙公网安备 33010602011771号