做题总结
2022.4.2
BS1215 旅馆Hotel :
线段树维护区间最大子段和,查询时线段树上二分。
BS1216 买水果 :push_up技巧。
inline void push_up(int id, int p) {
t[id][p].mx = std :: max(t[id][p << 1].mx, t[id][p << 1 | 1].mx);
t[id][p].mn = std :: min(t[id][p << 1].mn, t[id][p << 1 | 1].mn);
t[id][p].ans = std :: max(std :: max(t[id][p << 1].ans, t[id][p << 1 | 1].ans), t[id][p << 1 | 1].mx - t[id][p << 1].mn);
}
BS1221 环上最大子段和 :
分类讨论最大子段和是一段区间或者是前后缀拼起来,后者可以用总和减去最小子段和。
注意选全部和一个不选的情况。
BS2728【SCOI2010】序列操作:
注意标记下传的先后 :赋值 >乘法 = 翻转 > 加法。
2022.4.3
BS2437【SHOI2008】堵塞的交通:
维护加边,删边的连通性问题,如果不强制在线,可以直接线段树分治,复杂度 \(O(n\log^2n)\)
但发现列只有二 ,考虑直接用线段树维护矩阵四个端点的互相连通情况,是可以直接合并的。
把横向连边和纵向连边分开考虑,最后注意查询时可以绕路走,还需要分类讨论,注意多画图。
BS3387 【SHOI2015】脑洞治疗仪:
注意读题,脑洞是极长的 0 连续段,而填补是用 1 去填补 0。
二分 + 线段树。
BS6239 【SHOI2016】随机序列:
注意分析性质,把极长的 \(\times\) 看做一个点,那么把一个可能的表达式中的 \(+\) 与 \(-\) 互换再相加,就只剩下一个点,所以只有前缀积能造成贡献,系数为 \(2\times 3^{n-1-i}\),直接用线段树维护即可。
2022.4.4
BS3981【SDOI2014】向量集:
好题。
因为 \(ans = \max(x_0x_i+y_0y_i)\),把 \(y_i\) 前的系数化为 \(1\) 得到 \(\dfrac{ans}{y_0} = \dfrac{x_0}{y_0}x_i+y_i\) 。
注意到是一个 \(kx+y\) 的形式,所以最优点一定在凸包上。
若 \(y_0 >0\),则要最大化右式 \(y_i =-\dfrac{x_0}{y_0}x_i+\dfrac{ans}{y_0}\),维护上凸壳。
若 \(y_0 <0\),则要最小化右式,维护下凸壳。
用线段树维护区间凸壳,注意到是动态加点,查询。要等到这个区间被填满后再构建凸壳,可以直接用它的儿子的凸壳合并,查询时二分斜率,取 \(\max\) 即可。
BS2461 Optimal Milking:
线段树维护最大独立集,直接设 \(f_{0/1,0/1}\) 表示左端点选 / 不选,右端点选 / 不选的最大独立集。
BS6433 【ZJOI2019】语言
先算出有序点对 \((u,v), u \neq v\) 的数量,再除以 2 就是无序的了。
对于每一个点单独考虑,发现它能到达的点一定是一个连通块,而且是所有包含它的路径的并。
包含它的路径可以压缩成两个端点,所以一个连通块可以描述成若干个点形成的虚树的边的总和(因为 E = V - 1)。
所以现在的问题就是每个点有一个集合,每次把一条路径上的点的集合加入一个点,最后查询每个点集合形成的虚树大小。
可以直接差分,利用线段树合并维护,形成的虚树大小为所有点按 dfn 序排序后相邻的点距离之和+第一个点与最后一个点的距离 / 2。
BS5625 【PKUWC2018】Minimax
首先写出朴素dp : 设 \(f_{x,i}\) 表示 \(x\) 点的权值为 \(i\) 的概率, 没有儿子和只有一个儿子的转移是平凡的。只考虑两个儿子 \(y_1,y_2\) 的情况 :
\(f_{x,i} = (\sum\limits_{j=1}^{i-1}f_{y1,j} \times f_{y2,i}+\sum\limits_{j=1}^{i-1}f_{y2,i} \times f_{y1,i}) \times p_x + (\sum\limits_{j=i+1}^{m}f_{y1,j}\times f_{y2,i}+\sum\limits_{j=i+1}^{m}f_{y2,j}\times f_{y1,i})\times (1-p_x)\) 。
设 \(sum_x = \sum\limits_{i=1}^{m}f_{x,i}\) 后直接套用 P6773 [NOI2020] 命运 的线段树合并方法 :维护 \(f_{y1,i}\) 的前缀和 \(s_1\) ,\(f_{y2,i}\) 的前缀和 \(s_2\),类似 cdq 的思想,先合并左边,累加 \(s_1,s_2\),再合并右边,若没有左右儿子直接打上乘法标记。
标签:,limits,线段,times,y1,y2,sum 来源: https://www.cnblogs.com/henrici3106/p/16101421.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。