9.5模拟题解

C 李超树模板题。
注意eps。
B 这是我认为最有价值的题目。
本人思考了很久才得出此题正确解法。(其实走了很多弯路)
首先,猜一个结论:合法的段数不多。
这个结论是错的。因为如果a[i]单调递减,则段数可以达到n^2级别。
但是这给了我们一些启示。
考虑如何求出每一个合法的,以某一个元素为右端点额,第一类段。可以使用单调栈。
当栈顶的元素>当前元素,不断删除栈顶元素,再把当前元素插入栈。
设lv[i]表示i左边第一个>a[i]的元素,
栈内下标>lv[i]的元素就是以当前点结尾所形成的合法段。
注意到一个性质:如果设ri[j]表示扫至当前点i,以j为左端点的最长区间。则查询[l,i]的ri最大值就是答案。
考虑扫描线,每个询问区间挂在右端点上。
如果可以正确更新ri,就可以正确回答询问。
问题变成要维护一个数据结构,支持如下操作:
1.把所有有标记且权值>v的元素与一个值取max。
2.加入/移除一个标记
3.查询区间的i-ri[i]+1最小值
如果建出单调栈的树(uoj430),是不可做的
因为在更新树的值时还要维护对应标号的值。不可避免要嵌套数据结构
本人思考了这个算法很久,最后才发现不行。
可以使用两个线段树,一个维护已经出单调栈的答案,一个维护单调栈内的答案。
在弹栈时,在第二个线段树上查询值,在第一个上修改。
在更新答案时,找到对应位置,在第一个线段树区间赋值。
时间复杂度nlogn
由于数据水,使用单调栈深度有关做法也能过。本人在考试时写了这个做法,由于忽略了一个限制所以只拿了5分。
A
wys论文题。
建立点双树。
对于每一个圆点,拿到子树的最长链+次长链更新答案。
对于方点,要计算出环上的最长链以更新这个点的父亲。
以这个环为中心合并答案。
我们要求如下式子的最大值:f[i]+f[j]+min(sz-i+j,i-j)
通过钦定只取右边,破环为链,倍长链即可计算。
最后在算完这个方点后,要把他的答案来更新方点的父亲。
总结:一场思维难度和提高组day2相近的比赛。

原文地址:https://www.cnblogs.com/ctmlpfs/p/13624718.html