线段树/数状数组
文章平均质量分 52
张小生的先生
你要觉得我博客还行,就点赞加个关注,有意深聊的可以私信,随时欢迎,当然有女性想深聊的我更欢迎,要是男性的话不建议私聊,我跟一大老爷们真聊不起来。我人品五五开,胆小不好色,对女性要求不高但要识大体,样貌看得过去就行,其它的也就那样了。我不仅把这个当作学习博客也当作一个招友的圣地,希望在这里遇见更好的你。
展开
-
[Acwing] 区间最大公约数 线段树入门
题目链接:区间最大公约数题解本题有两个操作给区间加上一个数以及查询区间gcd(最大公约数)。查询按照线段树查询模板操作即可。难点在于区间修改。单纯的暴力每次修改O(nlogn),显然比直接暴力还暴力,定会超时。遇到这种给区间加上一个数的一般可想到差分思想刚好由夹逼准则不难证明一个等式:gcd(a1,a2,...,an)=gcd(a1,a2−a1,...an−an−1){gcd(a_1,a_2,...,a_n)=gcd(a_1,a_2-a_1,...a_n-a_{n-1})}gcd(a1,a2,原创 2021-05-02 23:46:46 · 139 阅读 · 0 评论 -
[2019 icpc徐州] H.Yuuki and a problem 带修改的主席树(主席树+树状数组)
#include<bits/stdc++.h>typedef long long ll;#define mid (l+r>>1)#define min(a,b) (a<b?a:b)using namespace std;const int N = 2e5 + 10;ll sum[N * 100];int Lc[N * 100], Rc[N * 100], tot;void insert(int& rt, int l, int r, int val, int原创 2021-04-23 22:50:49 · 195 阅读 · 0 评论 -
[HDU - 1542] Atlantis (线段树+扫描线 模版题)
题目链接:Atlantis题意给一些可能有重合部分的矩形组合成不规则图形,求这个不规则形状的面积。题解每个矩形都有左右边界,这些边界(x=c)将整个不规则图形划分为一个个区间,我们只需求出区间内不规则图形部分所占用的高,答案就是∑{\sum}∑区间长度*区间高。在求区间内不规则图形部分所占用的长度时。我们可以将每个矩形左边长度+1,右边长度-1,将所有的矩形的纵坐标点保存离散化成整数,用线段树维护一个个相邻纵坐标区间,保存纵坐标区间内不规则图形占用的长度以及覆盖的次数。很显然tree[1].le原创 2021-04-22 15:44:44 · 202 阅读 · 0 评论 -
[Codeforces Round #510 (Div. 2)] D. Petya and Array (归并/权值线段树/树状数组) 一题多解
题目链接:D. Petya and Array题解代码归并解法const int N=2e5+100;int n;LL sum[N];LL ans=0;LL t;void Solve(int l,int r) { if(l>=r)return; int mid=(l+r)>>1; Solve(l,mid); Solve(mid+1,r); LL ret=0; for(int i=l,j=mid+1;i<=mid;++i) { while(j<原创 2021-04-21 09:30:37 · 129 阅读 · 0 评论 -
[Codeforces Round #716 (Div. 2)] D. Cut and Stick 主席树
题目链接:D. Cut and Stick题意给你一个长度为n的序列,有q次查询,每次查询有一个区间范围[l,r],问如何划分a[l]~a[r],使得各个子序列每个数出现次数不超过⌈len2⌉{ \lceil \frac{len}{2} \rceil}⌈2len⌉,len为划分后的区间长度。注意子序列不一定连续。题解首先这道题我们需要知道任意一个区间内出现次数超过⌈len2⌉{ \lceil \frac{len}{2} \rceil}⌈2len⌉的x是谁。如果出现次数都没有超过说明没有必要划原创 2021-04-20 10:12:35 · 167 阅读 · 1 评论 -
[2021 icpc昆明] M.Stone Games 主席树
题目链接:M.Stone Games题解题目大意是求区间里任意数加和形成的集合中的mex值。mex值是集合中第一个未出现的整数。假设当前区间为al,al+1,..,ar{a_l,a_{l+1},..,a_r}al,al+1,..,ar,可以合成范围为[1,x] 。显然x=∑i=li=rai{\sum_{i=l}^{i=r} a_i}∑i=li=rai对于剩余未参与合成的数范围为[1,x+1]的一些数,总和为sum,若参与合成,则合成范围会扩大为[1,x+sum]。我们可以用主席树维护一原创 2021-04-14 23:09:55 · 303 阅读 · 0 评论 -
[ACwing] 256. 最大异或和 (可持久化数据结构)
题目链接:256. 最大异或和题解可持久化Trie树,评测机貌似不稳定,T了的代码再交一次就过了?代码#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<bitset>#include<cassert>#include<cctype>#include<cmath>#include<原创 2021-04-12 20:14:01 · 176 阅读 · 0 评论 -
[Codeforces Round #250 (Div. 1)] D. The Child and Sequence 线段树维护区间值以及单点更新
题目链接:D. The Child and Sequence题解本题的难点是取模。例如:x%i{x\%i}x%i如果i≤⌈x2⌉{i≤\lceil{\frac{x}{2}} \rceil}i≤⌈2x⌉,那么余数必定小于除数⌈x2⌉{\lceil{\frac{x}{2}} \rceil}⌈2x⌉如果x≥i>⌈x2⌉{x≥i> \lceil{\frac{x}{2}} \rceil}x≥i>⌈2x⌉,那么余数为x-i仍然小于⌈x2⌉{\lceil{\frac{x}{2}} \r原创 2021-04-10 12:11:06 · 110 阅读 · 0 评论 -
Educational Codeforces Round 104 (Rated for Div. 2) 题解
Educational Codeforces Round 104 (Rated for Div. 2)A. Arenaint a[maxn];int main(){ ios; int t; cin >> t; while (t--) { int n; cin >> n; int minn=inf; for(int i=1;i<=n;i++) { cin >> a[i]; minn=min(minn,a[i]);} int ans=原创 2021-03-04 22:23:21 · 399 阅读 · 2 评论 -
[2020 CCPC 威海] G. Caesar Cipher 线段树+hash
题目链接:G.Caesar Cipher题意给一个范围为[0,65535]的数组你可以进行以下操作:操作一:给出l和r,然后对[l,r]区间里的每一个数+1,然后每个数对65536取模操作二:给出x,y和l,询问[x,x+l-1]和[y,y+l-1]这两个区间里的元素是否完全相同,相同输出yes,否则no。题解对于询问区间相同,暴力显然不可行,所以只能哈希去判断,这种区间操作的题只能用线段树维护哈希。(大部分比赛中hash指的进制hash)想入门hash的可以看牛客有位大佬的博客:哈希从原创 2020-12-09 11:53:01 · 238 阅读 · 0 评论 -
[HDU - 3974] Assign the task 线段树+dfs序
题目链接:Assign the task 题解我们不难发现给树的一个节点及其子节点染色,可以转化为线段树区间修改模型。我们通过dfs,对每一个点进行重新编号。然后会发现重新编号后每个节点及其所有子节点的标号是连续的,所以我们可以转化为区间修改模型。剩下的就是线段树单点修改区间查询问题。本题我认为关键点在于dfs序对节点进行重新编号,这种从无序转化为连续的思想值得我们学习、举一反三。代码#include<iostream>#include<algorithm>#incl原创 2020-11-07 19:49:40 · 95 阅读 · 0 评论 -
[2020 计蒜之道线上决赛] C. 攀登山峰 主席树
题目链接: C. 攀登山峰代码#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<bitset>#include<cassert>#include<cctype>#include<cmath>#include<cstdlib>#include<ctime>#i原创 2020-11-05 22:55:40 · 131 阅读 · 0 评论 -
P3834 【模板】可持久化线段树 2(主席树)
P3834 【模板】可持久化线段树 2(主席树)代码** 注意离散化后的nn与n **#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<bitset>#include<cassert>#include<cctype>#include<cmath>#include<cstdlib.原创 2020-11-04 23:45:56 · 106 阅读 · 0 评论 -
[牛客算法竞赛入门课第九节习题] 连续区间的最大公约数 线段树区间合并
题目链接:连续区间的最大公约数 时隔一个月,终于抽时间解决了这个问题,真的不容易,在此膜拜那些写这些题的巨佬,没有他们,可能我一辈子都无法解出此题。~.~题意给你n个数a1,a2,....,an{a_1,a_2,....,a_n}a1,a2,....,an,有q次询问,每次询问一个区间[l,r]的gcd(al,al+1,al+2,....,ar){gcd(a_l,a_{l+1},a_{l+2},....,a_r)}gcd(al,al+1,al+2,....,ar)以及该区间有多少个子区间原创 2020-09-24 23:29:50 · 410 阅读 · 0 评论 -
[超级码力在线编程大赛初赛(二)] 3.区间异或 RMQ经典问题
题目链接:区间异或题意给你一个数组num,现在定义一个区间和:左区间的的最大值+右区间的最小值,现在有多组区间,每组区间包含左区间的L1和R1,以及右区间的L2和R2。问各个区间和的异或值是多少。题解经典的RMQ问题,一开始看本题的难度是一星,一直以为有什么巧妙的方法能避免用线段树或者ST表解决,思前想后没搞出来,写了一个权值线段树没有记忆化超时了,脑子一直没转过弯来。最后发现还是得用线段树或者ST表的方法解出。本题其实用线段树维护一个最大值和最小值即可或者维护一个最大值和一个最小值的ST表也行。原创 2020-08-30 17:25:21 · 207 阅读 · 0 评论 -
[2019 icpc 银川区域赛] G Pot!! 线段树区间查询
题目链接:G Pot!! 题意给你一个长度为n初始化为1的序列。你有两个操作给区间[l,r]里每一个数乘以v。查询区间里的一个最大值。这个最大值题目中有定义,其实知道唯一分解定理就不难理解,这个最大值就是一个数唯一分解后,所有质因数里最大的幂次。然后在区间[l,r]里面找每个数最大幂次的最大值。题解本题的入手点在于给区间乘以的一个数的大小≤10,10以内的数唯一分解后,无非2、3、5、7四种。...原创 2020-08-28 15:01:38 · 238 阅读 · 0 评论 -
[2020牛客算法竞赛入门课第九节习题] 小魂和他的数列 离散化+树状数组+dp优化
题目链接:小魂和他的数列题意给你一个长度为n的数列a,问数列一共有多少个长度为K的子序列是严格递增的。题解题目有个关键信息:1≤n≤500000,1≤k≤10。看到k这么小我首先想到的是能否用dp去解决,不出所料,感觉还真可以。定义dp[i][j] :以i结尾,长度为j严格递增的子序列有多少种。状态转移:dp[a[k]][j]=∑i=1i<a[k]dp[i][j−1]{dp[a[k]][j]=\sum_{i=1}^{i<a[k]}dp[i][j-1]}dp[a[k]][j]=∑i=原创 2020-08-22 14:00:34 · 241 阅读 · 0 评论 -
[2020牛客算法竞赛入门课第九节习题] 小翔和泰拉瑞亚 线段树+dp优化
题目链接:小翔和泰拉瑞亚题意给你一个长度为n的序列和m个操作,每个操作中,你要将li~ri{l_i~r_i}li~ri区间内每个数减少wi{w_i}wi。你可以从这m个操作中选择一部分,使得该序列(最大数-最小数)最大。题解本题一开始是毫无头绪的,如何选成了难题?但是有一个思路却让我柳暗花明,就是把第i个数当作最小值,那么很容易我们可以想到把所有能减小第i个数的区间都算进去一定能得到最优子结构的解。如果减小第i个数的区间不包含最大值,那么答案更优;如果包含,最大最小同时减对答案没有影响。原创 2020-08-22 12:03:50 · 267 阅读 · 0 评论 -
[2020牛客算法竞赛入门课第九节习题] 求最大值 贪心+线段树
题目链接:求最大值题意给你一个长度为n的序列,让你求整个序列中 (a[j]-a[i]) / (j-i) [1<=i<j<=n] 的最大值。其中会有q次操作,每次操作会选择一个位置上的数并将其变为y。每次操作完后输出最大值。题解不难看出,我们构建一个笛卡尔积<i,a[i]>,那么(a[j]-a[i]) / (j-i) 就是求一个二维坐标系里两点之间的斜率最大值,其实又很容易想出斜率最大值的两个点一定是连续的。由于这些点的x坐标不会相同,那么(a[j]-a[i]) / (j原创 2020-08-19 14:47:33 · 216 阅读 · 0 评论 -
[2020牛客算法竞赛入门课第九节习题] 小阳的贝壳 线段树好题
题目链接:小阳的贝壳题意给你一个长度为n的数列,你能进行三个操作:给区间[l,r]所有的值加上x询问区间[l,r]内相邻两个数差值绝对值的最大值询问[l,r]内所有数的最大公约数题解首先如果直接维护的话,步骤2和3很好实现,但是如果给区间增加一个数值,面对步骤3,我们很难在原有基础上改变,只能重新算,这样的时间复杂度和暴力无异。所以需要另辟蹊径。倘若我们维护一个差分数列,情况就变得简单了许多。设原数列:a1,a2,...,an{a_1,a_2,...,a_n}a1,a2,...,a原创 2020-08-19 14:04:10 · 194 阅读 · 0 评论 -
[2020牛客算法竞赛入门课第九节习题] 签到题 线段树(水题)
题目链接:签到题题意中文题意不多讲了题解如果你真憨憨地用它给的模版,有很大可能性会T,反正我是自己写了一个线段树过的。很明显这次我们连建树的操作都不需要了,我们所要进行的操作就是不断更新区间标记,把标记的区间答案更新然后再向上更新答案,可以用一个tree数组存储每个区间的答案,最后我们每次查询1~L的答案就是tree[1]。代码#include<iostream>#include<algorithm>#include<cstdio>#include&l原创 2020-08-15 16:21:36 · 213 阅读 · 0 评论 -
[2020牛客算法竞赛入门课第九节习题] 珂朵莉的数列 离散化+树状数组
题目链接:珂朵莉的数列题意有n×(n+1)2{\frac{n\times(n+1)}2}2n×(n+1) 个子区间,求出她们各自的逆序对个数,然后加起来输出。题解首先我们来看如何求一段序列中所有的逆序对数,求逆序对,我们可以转化为前i个数里,比a[i]大的有多少个。我们可以像桶排序一样,维护一个长度为max(ai){max(a_i)}max(ai)的树状数组,先统计树状数组内当前有多少个数比a[i]大,然后将a[i]更新即可。知道了如何求逆序对数,这道题我们已经解决了一半,但另一半的难点在于如原创 2020-08-07 13:03:30 · 264 阅读 · 0 评论 -
线段树区间修改板子
#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<bitset>#include<cassert>#include<cctype>#include<cmath>#include<cstdlib>#include<ctime>#include<deque>原创 2020-08-05 21:22:34 · 196 阅读 · 0 评论 -
[HDU - 1166] 敌兵布阵 线段树/树状数组板子题
题目链接:敌兵布阵题意中文题意,我就不多说了题解线段树点修改的板子/树状数组板子代码线段树#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<bitset>#include<cassert>#include<cctype>#include<cmath>#include<cs原创 2020-08-04 19:46:08 · 127 阅读 · 0 评论 -
[UVALive - 3938] “Ray, Pass me the dishes!“ (线段树)
题目链接:“Ray, Pass me the dishes!”对于刚接触线段树的我,一开始搞个这种难度的属实有点搞人心态,关键这题设的数据类型就很多,用线段树去维护三个值,然后还有很多细节要去处理,搞了一上午才搞出来,线段树还是做得少,得加把劲啊。题意给你一个长度为n的序列D,有m次查询。对于询问(l,r),需要我们找两个下标x和y,使a≤x≤y≤b,并且要求Dx+Dx+1+...+Dy{D_x+D_{x+1}+...+D_y}Dx+Dx+1+...+Dy的值尽可能大,如果多组满足,x和y应该尽原创 2020-08-04 16:01:01 · 173 阅读 · 0 评论 -
[P1972 [SDOI2009] HH的项链] 树状数组
题目链接:P1972 [SDOI2009]HH的项链这个题本来是当做莫队算法练手的,结果什么O2优化,快读快输出啥的都搞了,就是T,然后就把这个莫队ban了{\cancel{然后就把这个莫队ban了}}然后就把这个莫队ban了,于是慢慢发现这个算法是个伪算法。还是树状数组为正道解法。题意给你一个长度为n可能有重复数字的数组,然后q次查询,问区间[l,r]内不重复的数字有多少种。题解本题先分析,我们可以发现当[x,R] (R相同时),前面重复的只取最后一个就行。以样咧为例:61 2 3 4 3原创 2020-08-03 00:01:08 · 187 阅读 · 0 评论 -
[RMQ问题] Frequent values UVA - 11235 ST算法入门
题目链接:Frequent values本来昨天下午就能搞出来的题硬是被一个极其微小的错误搞得花了两天时间才解决,说明自己还是功底不够,还有一方面是对RMQ的运用不那么熟练以至于出错需要大量时间找错误。题意给你一个非降序的整数数组,你的任务是对于一系列查询(i,j),回答ai,ai+1,...,aj{a_i,a_{i+1},...,a_j}ai,ai+1,...,aj中出现次数最多的值所出现的次数。题解本题首先需要分析转换,如果按照正常暴力需要O(n2)O({n^2})O(n2)时间复杂度。原创 2020-08-01 11:46:21 · 154 阅读 · 0 评论 -
[UVALive - 4329] Ping pong 树状数组入门
题目链接:Ping pong 题意给你n个数,你从中取3个数,要求中间的数字大小在两边数字之间。问你总共有多少中取法。题解这个题首先需要分析转化。假设第i个人作为中间数a1~ai−1有ci个数小于ai,那么有(i−1−ci)个数大于ai;{a_1~a_{i-1}有c_i个数小于a_i,那么有(i-1-c_i)个数大于a_i;}a1~ai−1有ci个数小于ai,那么有(i−1−ci)个数大于ai;ai+1~an有di个数小于ai,那么有(n−i−di)个数大于ai{a_{i+1}~a原创 2020-07-30 11:48:58 · 186 阅读 · 0 评论