
线段树
文章平均质量分 92
C202044zxy
这个作者很懒,什么都没留下…
展开
-
[unknown OJ] ZZH的旅行
一、题目点此看题二、解法#include <cstdio>#include <vector>#include <iostream>#include <queue>using namespace std;const int M = 1000005;int read(){ int x=0,f=1;char c; while((c=getchar())<'0' || c>'9') {if(c=='-') f=-1;} while原创 2020-12-02 08:28:59 · 326 阅读 · 0 评论 -
[SDOI2016] 游戏
一、题目点此看题二、解法原创 2020-11-29 16:44:32 · 260 阅读 · 0 评论 -
[LOJ 6042] 跳蚤王国的宰相
https://loj.ac/p/6042原创 2020-11-28 15:38:49 · 197 阅读 · 0 评论 -
[LOJ 6034] 线段游戏
https://loj.ac/p/6034原创 2020-11-28 15:23:04 · 279 阅读 · 0 评论 -
[unknown OJ] 选举
VOTE \tt VOTE\spaceVOTE FOR\tt FORFOR TRUMP\space \tt TRUMP TRUMP一、题目点此看题二、解法先讲一讲考试时候写的暴力吧,我们先从前往后做一遍,前缀和如果小于 000 的话就删除这个 TTT,然后从后往前做一遍,后缀和如果小于 000 的话就删除这个 TTT,由于都是不行才删的策略所以是正确的。正解竟然是推柿子,我们尝试把上述过程形式化地写出来:对于询问[l,r][l,r][l,r],记 CCC原创 2020-11-25 09:10:31 · 247 阅读 · 0 评论 -
[nowcoder 2020] 斐波
一、题目点此看题二、解法面对这种题的时候,不要急,急了反而没有。真正的方法是一步一步来,你会发现都是套路。解决本题需要三步走,这是由中国的国情决定的0x01怎么计算 fib2(i)fib^2(i)fib2(i) ,由于iii很大(1e101e101e10范围),除了矩阵加速我们别无选择,紧紧抓住我们唯一拥有的条件:fib(i)=fib(i−1)+fib(i−2)fib(i)=fib(i-1)+fib(i-2)fib(i)=fib(i−1)+fib(i−2)那么fib2(i)=fib2(i−1)+原创 2020-11-14 15:17:06 · 176 阅读 · 0 评论 -
[APIO 2018] 新家
一、题目点此看题二、解法不难发现答案具有单调性,所以对于每个询问都可以二分答案。具体来说对于位置xxx,如果答案≥m\geq m≥m,那么等价于存在一种店在(x−m,x+m)(x-m,x+m)(x−m,x+m)不存在店,但是区间并不好维护,可以使用前驱来判断存在与否,那么等价于在[x+m,inf)[x+m,inf)[x+m,inf)存在店的前驱≤x−m\leq x-m≤x−m,那么我们只需要判断[x+m,inf)[x+m,inf)[x+m,inf)前驱的最小值mn≤x−mmn\leq x-mmn≤x原创 2020-10-21 17:01:23 · 236 阅读 · 0 评论 -
[JSOI2018]列队
https://www.luogu.com.cn/problem/P4559原创 2020-09-17 21:21:59 · 147 阅读 · 0 评论 -
To the moon
一、题目点此看题二、解法这道题涉及的知识点主要是主席树的区间修改。由于有共用节点,我们不能下传标记,所以写个标记永久化。#include <cstdio>const int M = 3000005;#define int long longint read(){ int x=0,flag=1;char c; while((c=getchar())<'0' || c>'9') if(c=='-') flag=-1; while(c>='0' &&am原创 2020-09-11 16:20:34 · 140 阅读 · 0 评论 -
Count on a tree
一、题目点此看题二、解法求第kkk小可以想到主席树,而主席树可以理解成前缀和,所以可以算出一个点到根路径上的主席树,然后询问的时候用 uuu的前缀和+v+v+v的前缀和−lca-lca−lca的前缀和−fa[lca]-fa[lca]−fa[lca]的前缀和#include <cstdio>#include <algorithm>using namespace std;const int M = 100005;int read(){ int x=0,flag=1;c原创 2020-09-11 14:55:39 · 165 阅读 · 0 评论 -
[HNOI2015]开店
一、题目点此看题原创 2020-09-11 09:07:31 · 161 阅读 · 0 评论 -
CF786B Legacy
一、题目点此看题二、解法原创 2020-08-24 11:27:59 · 143 阅读 · 0 评论 -
CF369E Valera and Queries
一、题目点此看题原创 2020-08-15 21:22:01 · 172 阅读 · 0 评论 -
CF817F MEX Queries
一、题目原创 2020-08-15 21:08:57 · 202 阅读 · 0 评论 -
CF718C Sasha and Array
一、题目点此看题二、解法原创 2020-08-15 20:52:45 · 230 阅读 · 0 评论 -
CF498D Traffic Jams in the Land
一、题目点此看题二、解法由于ai≤6a_i\le6ai≤6,并且lcm(1,2,3,4,5,6)=60lcm(1,2,3,4,5,6)=60lcm(1,2,3,4,5,6)=60,这道题要求区间查询和单点修改,那么可以考虑建立一颗线段树,每个节点上的f[i]f[i]f[i],表示时间模606060的余iii的时候开始,走完这个节点代表的区间的消耗时间。#include <cstdio>#include <iostream>using namespace std;con原创 2020-08-15 20:45:20 · 142 阅读 · 0 评论 -
CF1295E Permutation Separation
一、题目点此看题二、解法原创 2020-08-14 08:34:00 · 175 阅读 · 0 评论 -
CF1179C Serge and Dining Room
一、题目点此看题二、解法原创 2020-08-14 08:19:06 · 128 阅读 · 0 评论 -
CF474F Ant colony
一、题目点此看题二、解法原创 2020-08-13 20:07:18 · 147 阅读 · 0 评论 -
CF276E Little Girl and Problem on Trees
一、题目点此看题二、解法这道题翻译有点问题,有一个性质没有提到:除111以外的点,每个点的度数最多是222对于一个修改,先考虑把当前点所在的这条链更新,对每条链的点重新编号即可。再考虑更新111连出去的其他链,这些链影响的深度都是一样的,所以再维护每一个深度的公共权值(注意要在原来的链删去这个权值)思路不难,实则难写的一批,心态被写炸了。。。。#include <cstdio>#include <iostream>using namespace std;const原创 2020-08-13 17:21:51 · 189 阅读 · 0 评论 -
无聊的数对
一、题目点此看题二、解法本题的关键是理解:x xor y 的二进制表示下有奇数个1如果xxx有奇数个111,yyy有奇数个111,那么x⊕yx\oplus yx⊕y一定有偶数个111,可以发现只有一个为奇数个111,一个为偶数个111的情况异或起来才是奇数个111,问题转化成了在这些区间的并集中有多少个数奇数个111,有多少个数偶数个111显然就可以用动态开点线段树了,如果一个点被完全覆盖,如果他是叶子,判断加到哪一维,否则000的个数和111的个数都是len/2len/2len/2,当然需要从0原创 2020-06-13 15:10:01 · 208 阅读 · 0 评论 -
[FJOI2015]火星商店问题
一、题目点此看题二、解法外层就是一个线段树,所有节点上保存一个tiretiretire树,我们完全可以把所有tiretiretire树压在一起,写一个可持久化tiretiretire树,把这个可持久化理解成前缀和,lower_boundlower\_boundlower_bound找出一个答案产生的后缀,差分之后询问就行了。#include <cstdio>#include <vector>#include <iostream>using namespace原创 2020-05-18 22:13:47 · 191 阅读 · 0 评论 -
CF587E Duff as a Queen
一、题目点此看题二、解法区间修改太麻烦了,我们考虑差分,设b[i]=a[i]⊕a[i+1]b[i]=a[i]\oplus a[i+1]b[i]=a[i]⊕a[i+1],那么一个数可以表示成为a[l]×ba[l]\times ba[l]×b的前缀,我们把bbb建出线性基,那么这和把aaa建出线性基是等效的,因为可以表示的数不变。一个修改不会影响到bbb,我们改一下aaa就行了,上传的时候就暴力线段树合并,[l,r][l,r][l,r]的节点上我们还要维护一个a[l],a[r]a[l],a[r]a[l]原创 2020-05-13 21:18:58 · 237 阅读 · 0 评论 -
[HDU 4117] GRE Words
一、题目点此看题二、解法判断子串可以理解为在failfailfail链上是否出现过。假设我们要知道dp[i]dp[i]dp[i](选到iii的最大权值),并且我们已经知道了dp[1...i−1]dp[1...i-1]dp[1...i−1],我们可以把以前求出来的dpdpdp值更新failfailfail树上的子树的权值,算dp[i]dp[i]dp[i]的时候我们边匹配边获取以前标记的最大权值...原创 2020-02-23 22:42:46 · 218 阅读 · 0 评论 -
[HEOI2016/TJOI2016]字符串
一、题目点此看题二、解法首先一定要注意看题,题目求的是 s[a..b]的所有子串和s[c..d]的最长公共前缀先对原串建出后缀自动机,可以二分答案,我们只用计算s[a..b]s[a..b]s[a..b]中有没有s[c..c+x−1]s[c..c+x-1]s[c..c+x−1],我们需要先找出s[c..c+x−1]s[c..c+x-1]s[c..c+x−1]在自动机上对应的节点,可以先确定s...原创 2020-02-21 16:17:03 · 251 阅读 · 0 评论 -
CF1076G Array Game
一、题目点此看题二、解法首先从博弈的角度分析这道题,假设我们要算iii的胜负态,先看[i+1,i+m][i+1,i+m][i+1,i+m]中有没有必败态,如果有iii就是必胜态。否则我们只能拼当前点权的奇偶性,如果为偶就是必胜态,否则是必败态。然后这道题要修改,又要区间查询,肯定用线段树了。但现在我们发现问题很不好做,观察数据范围m<=5,这说明后面mmm个胜负态总情况不是很多(25...原创 2020-02-19 09:45:21 · 293 阅读 · 0 评论 -
CF700E Cool Slogans
一、题目点此看题二、解法可以建好后缀自动机后dpdpdp,容易发现我们只需要考虑一条链上的选取情况(即一定包含后缀关系,如果不包含则在另一条链上被考虑过了),设f[u]f[u]f[u]为自上到下dpdpdp到uuu,所取得的最大长度,我们还要维护一个决策点,dpdpdp时需要判断父亲的决策点是否在该节点代表的串中出现了两次。由于一定有后缀关系,我们只需要判断决策点的endposendpos...原创 2020-02-15 17:25:07 · 217 阅读 · 0 评论 -
CF666E Forensic Examination
一、题目点此看题二、解法先对模式串建出广义后缀自动机,如何快速匹配SSS的子串呢?可以先把SSS的前缀拿去匹配,记录下匹配点和匹配长度,子串的本质就是前缀的后缀,询问时拿到右端点的匹配点,倍增找到长度最小的大于子串长的点,则该点就是子串的匹配点。因为规定我们只能在[l,r][l,r][l,r]这个范围的字符串找最大值,要用线段树合并维护每个点在每一个模式串的出现次数,并维护出最大值,这一部...原创 2020-02-15 11:34:12 · 194 阅读 · 0 评论 -
CF833B The Bakery
一、题目点此看题二、解法暴力的dpdpdp比较好想,设dp[i][j]dp[i][j]dp[i][j]为前iii个里面划分jjj块,转移如下:dp[i][j]=dp[k][j−1]+cdp[i][j]=dp[k][j-1]+cdp[i][j]=dp[k][j−1]+c其中ccc为当前块的价值,从前往后扫就可以维护,时间复杂度O(n2k)O(n^2k)O(n2k)。观察上面的方程,好像可以...原创 2020-02-14 12:22:39 · 161 阅读 · 0 评论 -
CF853C Boredom
一、题目点此看题题目说的很不清楚,我再来解释一下:有一个 n×nn\times nn×n 的矩阵,一开始有人在上面标记了nnn个点(不重行,不重列),询问给定一个矩形,问有多少选两个点组成的矩形与给定的矩形相交(挨着也行)。二、解法正难则反,有一种计算方法就是用所有矩形减去不相交的矩形,xxx个点能生成的矩形数为 x(x−1)2\frac{x(x-1)}{2}2x(x−1) 。可以先...原创 2020-02-12 16:46:38 · 416 阅读 · 0 评论 -
[BZOJ 3413] 匹配
一、题目点此看题二、解法先对SSS建出后缀自动机,然后先判断TTT在SSS中是否出现过,对于自动机每个点我们维护一个最小的endposendposendpos,就可以知道TTT在SSS第一次出现的位置了。我们可以先对答案赋一个初始值,根据TTT在SSS中是否出现过而定,如果出现过,设出现位置(endposendposendpos)为FFF,那么答案的初始值应该是F−∣T∣F-|T|F−∣T...原创 2020-02-10 17:27:00 · 384 阅读 · 0 评论 -
CF1037H Security
一、题目点此看题二、解法既然是要求字典序严格大于模式串又要最小,答案肯定长这样:模式串的一段+比模式串大的一个字符。我们把模式串放在原串的后缀自动机上匹配,要保证能够匹配并且匹配到的是在[l,r][l,r][l,r]区间中的子串,所以我们需要维护出一个endposendposendpos集合,用于判断上面那个,可以用线段树合并的方法维护。如果一个点的endposendposendpos在[...原创 2020-02-09 17:33:28 · 233 阅读 · 0 评论 -
CF960F Pathwalks
一、题目点此看题关于luoguluoguluogu的题意我想做两点解释,避免异议:本题所指的最长的路径意思是经过边数最多的路径本题要求路径的中每一条的给出时间戳和边权严格递增二、解法即然要求给出时间戳递增,我们就考虑一条一条加边的时候顺便处理。每个点我们都维护一个以边权ccc结束的最多经过路径,每次加入一条边(u,v,c)(u,v,c)(u,v,c)就在vvv中查询以[0,c−1...原创 2020-02-03 11:58:08 · 445 阅读 · 0 评论 -
CF457C Elections
一、题目点此看题二、解法感觉这道题贪心不太好做,考虑暴力一点的方法。考虑从大到小枚举其他竞选人的最高票数,把超过的人的最便宜的选票买下来,这个是可以继承上一次的操作结果的,然后再看比枚举的最高票数差多少票,再买最便宜的票即可,这个可以用权值线段树维护。时间复杂度O(nlogn)O(n\log n)O(nlogn),只讲了大体思路,具体写法看代码吧。#include <cstdi...原创 2020-02-02 20:32:14 · 338 阅读 · 0 评论 -
阿凡达(类欧几里得算法)
一、题目二、解法由于nnn很大,但是操作数很小,且一开始没有初值,很容易想到动态开点,时间复杂度O(nlogn)O(n\log n)O(nlogn)。剩下的问题是如何计算一个修改段内的和,注意到(i−l+1)⋅x%y=(i−l+1)⋅x+(i−l+1)⋅xy(i-l+1)\cdot x\% y=(i-l+1)\cdot x+\frac{(i-l+1)\cdot x}{y}(i−l+1)⋅...原创 2020-01-23 17:17:28 · 348 阅读 · 0 评论 -
[BZOJ十连测]线段树
一、题目二、解法在若干次操作后,某一个位置的值可以表示成若干各区间的最大值。例如位置kkk,我们找到当前操作前最后一个(编号最大但小于当前编号)覆盖当前区间左端点的操作的左端点,最后一个覆盖当前当前区间右端点的操作的右端点,把这个左右端点当成一个新的操作区间,然后重复执行上述操作。也就是我们需要一直向左找,一直向右找,找到最左的和最右的ll,rrll,rrll,rr,kkk位置上面的即是...原创 2020-01-23 13:56:18 · 360 阅读 · 0 评论 -
[清华集训2015]V
一、题目点此看题二、解法本题的难点有两个:区间减(带比较),历史最大值。先解决第一个问题,带比较的区间减,我们也仿照这种形式,重新设计操作模式,设一个操作二元组(x,y)(x,y)(x,y),假设对ppp操作,得到的值为max(p+x,y)max(p+x,y)max(p+x,y),我们可以把三种修改都变成上述的形式:区间加法,设计二元组(x,−inf)(x,-inf)(x,−inf)...原创 2020-01-20 14:00:56 · 443 阅读 · 0 评论 -
[BZOJ 3821]玄学
一、题目UOJ的传送门二、解法离线的做法这道题强制在线,但是没有关系,我们讲一下离线的做法,会很有启发。考靠把询问和修改都放在[1,n][1,n][1,n]上面,我们从111扫到nnn,设当前点为xxx,我们维护包含当前点的操作为一颗线段树(树上节点表示连续的操作编号),当xxx为某一个操作的左端点时,加入这个操作的a,ba,ba,b,如果是某一个操作的右端点,删去这个操作的a,ba,b...原创 2020-01-19 21:05:02 · 521 阅读 · 0 评论 -
纪念碑
别问我这道题哪儿来的,我找不到题目链接,所以我只能写思路。一、题目题目描述在nmnmnm的网格中,给kkk个矩形建筑,问一个最大边长的正方形,使得这个正方形内不包含任何建筑。数据范围n,m≤106,p≤40000n,m\leq10^6,p\leq40000n,m≤106,p≤40000二、解法看到这道题会有很多想法,我就主要讲一下扫描线的做法吧。我们设两条在xxx轴上的扫描线l,r...原创 2020-01-19 16:08:09 · 191 阅读 · 0 评论 -
Sasha and Array
一、题目codeforces题目描述维护一个数列aaa,要求下列两项操作:区间加上某一值询问区间,把每一个值当做下标,问∑fai\sum f_{a_i}∑fai,fff是斐波那契数列,f0=f1=1,fi=fi−1+fi−2f_0=f_1=1,f_i=f_{i-1}+f_{i-2}f0=f1=1,fi=fi−1+fi−2二、解法考虑到斐波那契数列的计算方式,可以用...原创 2020-01-06 14:22:24 · 274 阅读 · 0 评论