随笔分类 - 线段树
摘要:题意 一颗1e5的数,1e5的询问,两种操作: 1.给x到y的所有点染成一种颜色 2.问x到y的路径上有多少段相同的颜色 思路 先考虑序列上,12操作均可以使用线段树来处理 需要注意的是,询问时只有在线段树上往两边同时下传的时候,才需要判断是否x需要答案 1 所以写的时候分三段写比较方便
阅读全文
摘要:题意 给nv; int find(ll x){ return lower_bound(v.begin(),v.end(),x) v.begin()+1; } ll P[maxn],L[maxn],R[maxn]; vectorin[maxn],out[maxn],hv[maxn]; ll Padd,
阅读全文
摘要:题意 2e5的数组,q个操作 1.将$a[x]$改为y 2.求下标l到r内所有的$a[i]$通过加法不能构成的最小的值 思路 通过二操作可以知道需要提取l到r内的值及其数量,而提取下标为l到r内的元素是~~一定~~要用主席树的 而用树状数组套上主席树即可实现修改操作 剩下需要解决的就是二操作: 首先
阅读全文
摘要:引子 对hdu6703,首先将问题转化为“询问一个排列中大于等于k的值里,下标超过r的最小权值是多少” 我们采用官方题解中的做法:权值线段树+剪枝 对(a[i],i)建线段树,查询权值线段树的[k,n]中第一个下标超过r的值 代码是这样的 int ask(int l, int r, int root
阅读全文
摘要:题意: 1e5的数组,c(1e5)种数字求最长的子串,使得其中每个出现的数字出现的次数为0次或者大于k次 思路: 枚举右端点i,维护当前右端点时,每个左端点的可行元素数量,当且仅当可行元素为c时更新答案 每次用最左边的可行的左端点与当前右端点更新答案 对于每个元素,如果它从i往左第1次出现的元素为p
阅读全文
摘要:题意: 给你一个数组,q次询问,每次问你[l,r]范围内与p距离第k大的元素的与p的距离,强制在线 思路: 主席树提取出[l,r]内的权值线段树,然后二分与p的距离mid ask该权值线段树里[p-mid,p+mid]的数的个数,使其刚好大于等于k 代码:
阅读全文
摘要:题意: 初始n个空串,m个操作: 1.给[l,r]的所有字符串头尾加一个‘d’,将原字符串x变为dxd 2.求[l,r]所有字符串代表的数字之和mod 1e9+7 思路: 据说是硬核线段树。。 对于线段树我们要先找出来对于一个区间改变的时候对要询问的区间(sum)造成的变化 对于一个数x,如果对他操
阅读全文
摘要:题意: 有一棵点数为 N 的树,以点 1 为根,且树点有边权。然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a 。 操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 a 。 操作 3 :询问某个节点 x 到根的路径中所有点的点权和。 思路: 处理出这棵树的欧拉序
阅读全文
摘要:题意: q次询问,问[l,r]子区间的mex值 思路: 对子区间[l,r],当l固定的时候,[l,r]的mex值对r单调不减 对询问按照l离线,对当前的l,都有维护一个线段树,每个叶节点保存[l,r]的mex l每增大1,都要更新[l, next[l]-1],将这个区间内大于a[l]的值更新为a[l
阅读全文
摘要:题意: 左端点在[a,b],右端点在[c,d],求这个线段里中位数(上取整)最大值 思路: 对数组离散化,对每一个值建中位数的可持久化线段树(有重复也没事),就是对于root[i],大于等于i的值为1,小于的为-1, 从小到大插入可持久化线段树即可 如果中位数为m,那么从左端点到右端点[l,r]的序
阅读全文
摘要:题意: n<=1e5的图里,在线连边、查询某连通块第k大 思路: 练习线段树合并的好题,因为依然记得上一次启发式合并trie的时候内存爆炸的恐怖,所以这次还是用了动态开点、回收 听说启发式合并splay更快QAQ,学会了试试 代码:
阅读全文
摘要:题意: 一个1e6*1e6的棋盘,有两个操作:给(x,y)加上颜色c,或查找(1,y1)到(x,y2)内的颜色种类数量,最多有50种颜色 思路: 建立50颗线段树,对每个颜色的线段树,维护每个y坐标上x的最小值 但是这样会爆内存,于是动态开点即可 动态开点之后T了一发,就改了下查询的函数,只要有满足
阅读全文
摘要:题意: 有n个数的一个数组a,有两个操作: 1 l r:查询区间[l,r]内$a[l]*(r-l+1)+a[l+1]*(r-l)+a[l+2]*(r-l-1)+\cdots+a[r-1]*2+a[r]$ 2 l r:将a[l]修改为r n<=1e5, a[i]<=1e9 思路: 预处理出前缀和s[i
阅读全文

浙公网安备 33010602011771号