抱灵的第二天
0.闲扯
来了看题发现题面很奇怪,然后又看到巨大多的部分分,感觉今天要人均 \(200+\)
T1 甚至看出来了二分再从基环树上 dp,然而考场发现自己太菜了没怎么处理过基环树然后就挂飞了/kk
出了成绩发现果真人均 \(200+\),爬了爬了。
今天好像又坏了几台电脑+下午反复跳闸,看来 pyyz 的经费用错地方了/qd
1.题解
A
给定一个每个点只有一条入边的图,可以按照边转移点权,也可以加至多 \(m\) 的点权,最大化最小点权。
申必题,略。然而我被申必题切了,所以我是申必
B
给定三个序列,求所有区间在三个序列上的极差之积。
三个数列都单调不降的情况是平凡的,暴拆式子然后胡乱维护一波。
否则最小值随着左端点向左单调不增,把它们放入单调栈,更新右端点时维护单调栈即可。
C
一个序列,每次询问给出 \(l,r,v\) 求 \([l,r]\) 内进行 \(|v-a_i|\) 得到的结果,强制在线。
先考虑全局的情况,从右往左扫描线,加入一个变换相当于复制一段区间、翻转一段区间,维护一个可持久化平衡树可以解决。
然后上线段树就做完了。
2.CF*3000 DS 选讲
CF464E
我们考虑这个奇奇怪怪的边权会造成什么影响:我们需要支持 \(\text{dis}_u=\text{dis}_v+w_{u,v}\) 和比较操作。
用奇怪的数据结构维护这个边权和距离,那么赋值操作就是复制再修改。
由于边权只有一个 \(1\),所以我们只会发生一段进位,然后二分找这段区间打标记。比较大小可以记录区间哈希值。
CF765F
固定 \(a_i\),我们考虑哪些数对是有意义的:如果区间内 \(a_i<a_j<a_k\),那么 \((i,k)\) 一定是没有贡献的。
如果 \(a_i<a_j>a_k\),分情况讨论 \(a_i\) 和 \(a_k\) 的大小关系即可。
CF700D
考虑 Huffman Tree 的构造过程:对每种出现的元素做合并果子。而不同的出现次数显然是 \(O(\sqrt{n})\) 的,考虑用莫队维护。
有些奇怪的细节和优化,写到这题时再说吧。咕咕咕
CF1344E
对于每个点维护出所有火车到达的时刻,进行启发式合并,如果有前驱关系并且不在同一个儿子那么必须在两辆车之间切换。
为了水篇幅补一道昨天的 P6617
如果离线这题就变成傻逼题了,很可惜不行。
对于每个点设其前驱为最近的与其和为 \(w\) 的位置,然后只需判断前驱的最大值是否在区间里。
考虑如何修改,显然不能暴力 \(O(n)\)。
由于只需判定存在性,对于有包含关系的一些合法区间我们只保留一个,这样每个点只会存在 \(O(1)\) 个配对关系,然后线段树维护最大值,std::set
维护前驱后继。