2025 刷题计划 - 线段树
2025 刷题计划 - 线段树
A. P3313 [SDOI2014] 旅行
树剖板子题,开
B. P3924 康娜的线段树
有意思的一道题,貌似
首先易得期望的计算方式即为:设当前节点
当遇到区间加的修改时,答案增大了
具体实现的时候不需要
C. P4243 [JSOI2009] 等差数列
很好的线段树练习题。
首先维护等差数列容易想到维护差分序列。那么差分后,等差数列就转化为给差分数列的两个单修和一个区修。考虑怎么统计答案,通过线段树维护区间最大子段和的套路,用
friend SegTree operator+(const SegTree&x,const SegTree&y){
SegTree res;
res.l=x.l,res.r=y.r;
bool fl=x.r==y.l;
res.s[0]=min({x.s[2]+y.s[1]-fl,x.s[0]+y.s[1],y.s[0]+x.s[2]});
res.s[1]=min({x.s[1]+y.s[1],x.s[3]+y.s[0],x.s[3]+y.s[1]-fl});
res.s[2]=min({y.s[2]+x.s[2],y.s[3]+x.s[0],y.s[3]+x.s[2]-fl});
res.s[3]=min({x.s[1]+y.s[3],y.s[2]+x.s[3],x.s[3]+y.s[3]-fl});
return res;
}
注意结构体需要写构造函数进行初始化!
另外,差分数组我们只考虑
D. P1545 [USACO04DEC] Dividing the Path G
一个区间左右喷灌很不好处理,考虑把它转化为只向左喷灌,把喷灌区间 然后这题你就愉快地水过去了。
转移方程:
正解当然是线段树优化 DP,主要是优化了区间取最小值的过程。跑得还没暴力快。
E. CF1975E Chain Queries
看似一眼题的一道树剖题。做法很多。
一种比较简单的做法是找全部黑点成为一条链的性质。易得(?的性质是:
如果全部黑点成为一条链,则试统计没有儿子是黑点的黑点个数,记为
。若 ,直接输出 Yes
(此时所有黑点必定成链且链的一端是所有黑点的祖先);若,将两点记为 ,则形成一条路径当且仅当 的路径的黑点数量等于 ;若 必定是 No
。
实际上这个题已经做完了。可以把上文说的没有儿子是黑点的黑点用 unordered_set 维护,开一个数组统计每个黑点有多少个黑色儿子即可。每次对一个点取反影响的只有它自己和它父亲,维护也是容易的。路径问题直接树剖,容易发现这题只有一个单点修改和区间查询,所以用不着线段树,树状数组即可解决。
F. CF2042F Two Subarrays
官解的矩阵做法略显抽象,还是学习一下线段树维护八个标记。
G. P3833 [SHOI2012] 魔法树
傻逼树剖板子题。
H. P4340 [SHOI2016] 随机序列
诈骗题。注意到一个不太能注意到的一个注意到:任何一组带有加号的序列必定有一组带有减号的序列抵消它。所以我们维护的实际上只是乘法前缀。预处理乘法前缀并统计答案即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】