线段树
文章平均质量分 57
1
kaka0010
退役ACMer/算法竞赛菜鸡
展开
-
ICPC网络赛第二场 L.Euler Function 欧拉函数性质+势能线段树
原题链接:https://pintia.cn/problem-sets/1441745686294945792/problems/1441745856154955787目录题意分析Code题意有n个数的序列ai,有两种操作l r x 对区间[l,r][l,r][l,r]的数乘xl r 求∑lrϕ(ai)\sum_{l}^{r}\phi(ai)∑lrϕ(ai)分析根据欧拉函数性质,欧拉函数是一个积性函数,因此对于任意prime,ϕ(n∗prime)=ϕ(n)∗prime[gcd(n原创 2021-09-28 10:30:17 · 375 阅读 · 0 评论 -
Codeforces Round #742 (Div. 2) E. Non-Decreasing Dilemma 线段树
原题链接:https://codeforces.ml/contest/1567/problem/E目录题意分析Code题意有一个a序列,接下来会有两个操作x y 将axa_xax改为yl r 查询[l,r][l,r][l,r]区间内有多少p,q满足l<=p<=q<=r且[ap,ap+1..aq][a_p,a_{p+1}..a_{q}][ap,ap+1..aq]为不递减序列分析当我们知道一个区间大小为len时,那么满足条件的p,q对数为len∗(len+1)/2le原创 2021-09-07 15:21:01 · 110 阅读 · 0 评论 -
Codeforces Round #737 (Div. 2) D. Ezzat and Grid 线段树模拟最长上升子序列
原题链接:https://codeforces.ml/contest/1557/problem/D目录题意分析Code题意有n行长度为1e9的01串,如果两个串相同位置都有1,我们称这两个串是美丽串,可以删除一些串,问最长美丽串的长度是多少。分析题意还是比较明显的,最长子串我们可以转化成最长上升子序列的模型。在动态规划中LIS就可以用线段树优化到O(NlogN)O(NlogN)O(NlogN),每次找当前最长串,然后再将当前贡献存进去,相当于区间查询,单点修改。而这次,每个01串都有很多小区间,其原创 2021-08-10 10:43:56 · 188 阅读 · 0 评论 -
Wannafly挑战赛18 E.极差 线段树+单调栈
原题链接:https://ac.nowcoder.com/acm/contest/129/E目录题意分析Code题意给出三个长度为n的序列,一个区间[l,r]的价值定义为三个区间内最大和最小值之差的乘积,求区间和,对2^32取模。分析对于最大最小值之差的问题,我们可以枚举右断点,左端点利用单调栈进行维护。需要开两个单调栈,一个维护最大值区间,一个维护最小值区间。对于维护最小值的单调栈,栈内元素应该单调递增,因为右端点确定的情况下,如果是左边存在比当前元素大的值,那么那个值对右边的最小值已经不会原创 2021-08-04 17:03:31 · 225 阅读 · 0 评论 -
P3224 [HNOI2012]永无乡 并查集+线段树合并
原题链接:https://www.luogu.com.cn/problem/P3224目录题意分析Code题意分析和主席树操作有些像,查询区间K大,但这题又带上了修改,因此我们考虑用线段树合并。直接开n个权值线段树,然后用并查集维护当前连通块。由于这题比较模板,就不多解释了。Code#include <bits/stdc++.h>#define lowbit(i) i & -i#define Debug(x) cout << x << endl原创 2021-07-28 18:25:08 · 112 阅读 · 0 评论 -
2021牛客暑期多校训练营4 E.Tree Xor 线段树+扫描线原理
原题链接:https://ac.nowcoder.com/acm/contest/11255/E目录题意分析Code题意有一棵树,每个节点都有一个权值a[i]a[i]a[i]的取值范围[L[i],R[i]][L[i],R[i]][L[i],R[i]],每条边也有权值www满足a[u]⨁a[v]a[u] \bigoplus a[v]a[u]⨁a[v],询问方案数。分析我们知道如果确定一个点,那么所有点基本上就已经确定了。但枚举一个点的所有权值的话,O(230∗n)O(2^{30}*n)O(230∗n原创 2021-07-28 09:32:15 · 187 阅读 · 0 评论 -
2019ICPC西安邀请赛 E. Tree 树剖 + 线段树
原题链接:https://nanti.jisuanke.com/t/39272目录题意分析code题意有一个树形结构,n个节点,有三种操作1到s路径上的节点值或上t1到s路径上的节点值与上t在1到s路径中的石子中加入一堆t石子,并开始尼姆游戏问先手是否必胜分析树上路径带修改,一看就是树剖的题。尼姆游戏也是个结论,只要全部值异或和为0,先手必败,反之先手必胜最后处理位运算,我们可以拆成30棵线段树,每颗线段树存放第i位上的值,这样进行或运算时,我们只需要把t在2进制下为1的位在线段树上原创 2021-07-10 09:09:14 · 108 阅读 · 0 评论 -
牛客练习赛56 D.小翔和泰拉瑞亚 线段树
原题链接:https://ac.nowcoder.com/acm/contest/3566/D目录题意分析Code题意有n个数组成的序列,你有m种操作,每次选择[l,r][l,r][l,r]区间减去w,你可以从m次操作中任意选择一些操作完成,求完成后整个序列的最大最小值之差最大是多少分析首先可以枚举每个数,尽量使它的值减少,用掉所有包含该位置的操作,然后求出全局的最高位置,用最高位置与当前枚举到的位置的高度差来更新答案。这样必定能够求到最优解。因此我们对询问按照左端点进行排序,当操作区间左端点小于原创 2021-05-17 14:11:28 · 149 阅读 · 2 评论 -
HDU 6606 Distribution of books 二分答案+权值线段树优化dp
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=6606目录题意分析Code题意有n本书,你需要把它分成k组,每组必须有一个,而且分组必须是连续的,最后多余的书可以丢掉。每组书的权值和为sumisum_{i}sumi,现在我们求max(sum1..sumk)最小max(sum1..sumk)最小max(sum1..sumk)最小分析一般求最大值最小或最小值最大的问题都是用二分答案,所以我们往这方面去想。直接设mid为每组的最大值,那么我们则用这个标原创 2021-05-07 13:23:22 · 132 阅读 · 0 评论 -
HDU 6602 Longest Subarray 思维+线段树
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=6602目录题意分析Code题意有一个序列,如果子序列满足∑i=lr[ai=x]=0or∑i=lr[ai=x]>=k\sum_{i=l}^{r}[a_{i}=x]=0or\sum_{i=l}^{r}[a_{i}=x]>=ki=l∑r[ai=x]=0ori=l∑r[ai=x]>=k则称这个子序列是好的子序列,问最长的好的子序列长度是多少分析非常好的一道思维题,首先考虑枚举一个端原创 2021-04-30 14:46:21 · 270 阅读 · 0 评论 -
牛客练习赛3 F 监视任务 线段树+贪心
原题链接:https://ac.nowcoder.com/acm/contest/13/F目录题意分析Code题意有一个数轴,有m次询问,l,r,w代表[l,r]区间内有w个点,问最后最少有几个点可以满足询问。分析首先考虑贪心,因为当前决策肯定是会对后面的区间产生影响的,因此可以把区间按照右端点进行排序,然后每次都把点放在最右边,这样对后面的区间来说一定是最优策略。然后考虑怎么放在最右端,这就是经典的线段树操作了,先查询当前区间内已经放了几个,然后再把剩余的加进区间里按照从右往左的顺序,只要先递原创 2021-04-11 20:51:05 · 123 阅读 · 0 评论 -
ZOJ 4009 And Another Data Structure Problem 线段树+循环节+标记永久化
原题链接:https://zoj.pintia.cn/problem-sets/91827364500/problems/91827370220目录题意分析Code题意一个序列有n个元素,你现在有2种操作1.输入lr,改变al,al+1..ar为al3,al+13..ar31. 输入l r, 改变al,a_{l+1}..ar为al^3,a_{l+1}^3..a_{r}^31.输入lr,改变al,al+1..ar为al3,al+13..ar32.输入lr,查询当前[l,r]之间的和,模上99原创 2021-04-09 18:37:37 · 115 阅读 · 0 评论 -
2019ICPC0南昌 K Tree 树上启发式和并+动态开点线段树
原题链接:https://nanti.jisuanke.com/t/42586目录题意分析Code题意有一棵树,每个点都有权值vi,求满足以下三个条件的点对个数这两个点不能互为祖先节点这两个点之间的最短距离不能超过k这两个点的最近公共祖先节点的权值*2等于这两个点权值之和分析看到树上统计点对的个数,不难想到树上启发式合并和点分治,接着又两个约束条件,一个是树上路径,还有一个是权值约束,树上路径根据套路可以转化为深度,如果已知dep[u]和路径长度k求dep[v],那么dep[v]=2∗原创 2021-04-02 09:59:23 · 1202 阅读 · 0 评论 -
2020CCPC威海 G. Caesar Cipher 线段树+哈希
原题链接:https://codeforces.ml/gym/102798/problem/G目录题意分析Code题意有一串序列,有两个操作l r 给[l,r]区间内的数加1再对65536取模x y len 问区间[x, x+len-1]和[y, y+len-1]子串是否相同分析先来看第二个操作,非常典型的哈希操作,我们先设一个f[i]为base^i,然后hash值就是当前的数字a[i]乘上f[i],那么整个区间的哈希值就是∑lr(f[i]∗a[i])\sum_{l}^{r}(f[i]*原创 2021-03-26 12:31:43 · 211 阅读 · 0 评论 -
Codeforces Round #684 (Div. 2) E. Greedy Shopping 线段树+暴力剪枝
原题链接:https://codeforces.ml/contest/1440/problem/E目录题意分析Code题意有一个不递增的序列,有两个操作x y 表示对[1, x]的元素取max(a[i], y)x y 表示你有y元钱,对[x, n]的元素有序买东西,能买就买,输出购买的数量分析因为操作是对[1,x]取max,因此不论怎么操作数列仍然是不递增的,这是关键的题意转化,对于操作1的实现,我们记一个懒惰标记就可以轻松解决了。对于操作2来说,我们要从左往右取,因此需要一些剪枝的技巧原创 2021-03-26 11:06:22 · 127 阅读 · 0 评论 -
Educational Codeforces Round 23 F. MEX Queries 线段树+离散化
原题链接:https://codeforces.ml/problemset/problem/817/F题意最开始有一个空集合和一个序列,有三种操作l, r 将序列[l,r]之间的未出现数加入集合中,不重复l, r 将序列[l,r]之间的出现数从集合中删除l, r 将序列[l,r]之间未出现的数加入集合,并且将出现的数从集合中删除分析整个过程都可以用线段树来模拟:第一个操作实质就是将[l,r]区间覆盖成1,代表在集合中第二个操作实质就是将[l.r]区间覆盖成0,代表从集合中删除第三个原创 2021-03-25 14:27:08 · 122 阅读 · 0 评论 -
2019 ICPC Asia Jakarta Regional Contest G. Performance Review 线段树
原题链接:https://codeforces.ml/contest/1252/problem/G目录题意分析Code题意一个公司有n个人,每年有若干个人应聘,每次都会开除排名倒数的若干个人并将所有应聘的人招进公司,接下来有q次修改,每次可以修改每年应聘人的能力值,并询问1号员工能否在m年后仍然在公司分析如果直接暴力去模拟肯定是不行的,因为O(qm)的复杂度就已经超时了,这时要想办法去优化查询。首先肯定要预处理出没有修改时当前员工在每年的排名情况,并且当前排名还要加上下一年招的人数,如果这个值大原创 2021-03-11 15:36:32 · 138 阅读 · 1 评论 -
2019 ICPC Asia Jakarta Regional Contest K. Addition Robot 线段树+矩阵乘法
原题链接:https://codeforces.ml/problemset/problem/1252/K目录题意分析Code(直接转置763 ms)Code(开两颗线段树858 ms)题意有一个长度为N的字符串,只含有AB两种字符,接下来有2种操作l r 将区间[l, r]内的A变成B,B变成Al r a b 在区间[l, r]内,如果遇到A,a变成a和b之和,反之,b变成a和b之和,并输出最终的a b分析第一个操作区间翻转可以用线段树轻松维护,但第二个操作有些棘手。学过矩阵乘法的同学都原创 2021-03-11 14:13:49 · 1344 阅读 · 4 评论 -
Codeforces Round #705 (Div. 2) D. GCD of an Array 动态开点线段树+质因数分解
原题链接:https://codeforces.ml/contest/1493/problem/D目录题意分析Code题意有n个数,每回合可以对某个位置的数乘x,并求出所有数的gcd分析区间gcd问题,数值很大,不能暴力求解,因此可以维护最小个数的质因子个数例如有三个数a=p1ka1p2ka2p3ka3...a=p_1^{k_{a_1}}p_2^{k_{a_2}}p_3^{k{a_3}}...a=p1ka1p2ka2p3ka3...b=p1kb1p2kb2p3kb3...b=原创 2021-03-07 21:00:21 · 161 阅读 · 0 评论 -
2021牛客寒假算法基础集训营6 H动态最小生成树 线段树优化kruskal
目录题意分析Code题意分析赛中直接暴力水过去了,现在补一个正解。拿到题目分析,如果是暴力枚举边,复杂度是qmlogm肯定是不行的。有些人会想,那我预处理一下边,然后修改时单点插入和删除,这样修改可以做到O(1),但还是得枚举边qm的复杂度也逃不掉,顶多少了一个log。还有一些高端选手可能就直接上待修莫队了,但常数也是大的吓人,因此题解中给到了线段树的优化。我们把线段树上的每个点都看成一个集合,代表了选择[l,r]范围的边所构成最小生成树的边集,这样每个点集其实最多只有n-1条边,一下子就减原创 2021-02-25 22:50:30 · 137 阅读 · 0 评论 -
2021牛客寒假算法基础集训营3 E 买礼物 线段树+链表
https://ac.nowcoder.com/acm/contest/9983/E目录题意分析Code题意有n个礼物,每个礼物都有不同的编号,下面有m次操作x 拿走x位置的礼物x, y 询问[x,y]区间内是否存在两个一样的礼物分析看一眼单点修改区间查询,然后转换一下题意变成找区间出现最多的数咦~这不是分块or莫队轻松解决然后瞄一眼数据范围5e5,优雅暴力 基本是没戏题解给了一种非常巧的解法,用链表链接前后两个编号相同的点,然后在查询区间中是否存在两个相同的编号就可以转化为[l,原创 2021-02-06 10:17:35 · 214 阅读 · 1 评论 -
Codeforces Round #698 (Div. 2) E. Nezzar and Binary String 离线+线段树
https://codeforces.ml/contest/1478/problem/E目录题意分析Code题意给你两个01字符串,要求从第一个字符串转换成第二个字符串,并满足以下要求每次给定一个检查区间,要求这个区间内必须是单一的0或1你可以在检查之前偷偷修改严格小于区间一半的字符数如果可以转换成功输出YES,否则输出NO分析正难则反,我们可以考虑离线的做法,从最后的状态一步步推到最初的状态,因为从后往前方案是一定确定的。我们只需要统计当前区间内有多少个1和0,然后判断应该怎么去翻就可原创 2021-01-29 13:59:58 · 238 阅读 · 1 评论 -
牛客练习赛73 D离别 线段树+离线
原题链接题意给定一个长度为n的数列,每次询问一个区间(L, R),求满足区间内最大出现次数等于k次的子区间个数分析对于子区间问题,我们可以离线处理出所有满足的区间。比如对所有区间的右边界进行排序,然后遍历右边界,找到符合的左边界的区间。至于怎么去找符合条件的左区间,我们可以用一个队列来存相同数字的下标,如果刚好出现第k个数字,那么队列里第一个数字就是左区间的右边界,如果出现了大于k个数字,那么队列里第一个数字的下标+1就是满足条件的左区间的左边界,那么在左右边界之内的都是合法的。区间和自然可以考虑用原创 2020-11-23 12:24:52 · 197 阅读 · 0 评论 -
2020浙江省赛ZJCPC B.Bin Packing Problem (线段树+map)
原题链接题意:按顺序(记住放入物品的顺序是给定的)给一串序列,代表物品的重量,并且给定容器的容量大小, 要求最少需要几个容器存放这些物品。题中给了两种算法:从前往后遍历容器,找到第一个可以放的容器,把物品放进去,如果放不了,再开一个位置找到能放并且当前剩余容量最小的容器,如果放不下,再开一个位置第一个算法按照朴素算法,需要n2的复杂度。但我们可以考虑维护区间的最值,如果可以往左找就一直往左,直到找到。因此可以考虑线段树,我们维护区间的最值,初始值全部赋值为容量,如果当前放的物品体积小于左子树原创 2020-10-23 15:01:35 · 1397 阅读 · 0 评论