CF 下分记录

924 div2

\(+61=2141\)

C 想得不是很清楚,有个 \(\pm1\) 在代码里反了,拍了一下才检查出来。这种题还是在草稿纸上写清楚吧
E 一开始想的是判定性 DP,胡了一会才想到可以把一个状态放到 DP 值里。没开 LL 吃了个罚时,唉
难得在最后 5min 过了 E,安享晚年.jpg

hello2024

\(+31=2080\)

签得很慢
zsy 很早就告诉我 D 容易/jk
好在会 F1,不至于掉分。不过把 bld 改成 mdf 的时候没判断递归哪边吃了个罚时
过了零点脑子完全不转了,最后也不会 D

C. Grouping Increases

赛时写了个线段树优化 dp。。。

考虑贪心。设 \(x\le y\) 为两个子序列末尾的元素。加入 \(a_{i}\) 时,

  • \(a_{i}\le x\),令 \(x=a_{i}\)
  • \(x<a_{i}\le y\),令 \(y=a_{i}\)
  • \(a_{i}>y\),令 \(x=a_{i}\)

证明考虑 \(a_{i}\) 最多在前后各造成 \(1\) 的代价,能不在前面付出代价就不要付出。\(x\) 一定时 \(y\) 越大越好
时间复杂度 \(O(n)\)

D. 01 Tree

显然父亲相同的叶子到根的距离差 \(1\),且父亲到根的距离为儿子中距离较小的那个。赛时一直在想根据 dfs 序构造

考虑剥叶子。问题转化为若 \(a[i]=a[i-1]+1\)\(a[i]=a[i+1]+1\) 则可以删去 \(a[i]\),问能否删至只剩 \(0\)。每次尝试删最大值就行了
可以做到 \(O(n)\)

edu152(div2)

\(+174=2049\)

B 没细看数据范围 WA 了一次
D 没判 \(i-1=0\) WA 了一次

E. Max to the Right of Min

考虑增大右端点,维护每个左端点的合法性

当右端点从 \(r-1\) 增大到 \(r\) 时,

  • \(a[r-1]<a[r]\)\(r\) 只能作为区间最大值。记上一个 \(>a[r]\) 的位置是 \(p\),那么 \(i\in(p,r],[i,r]\) 的最大值是 \(r\),一定合法。对于 \(i\le p\),最值都不是 \(r\),合法性不变
  • \(a[r-1]>a[r]\)\(r\) 只能作为区间最小值。同理

数据结构维护合法的左端点,支持插入/删除末尾一个区间。使用栈可以做到 \(O(n)\)

F. XOR Partition

套路题,不应该不会做

赛时想法是分裂 trie(单 log

标算是每次把异或最小的一对数分开,用二分图划分两个集合,发现这个过程就是 xor mst(双 log)

posted @ 2023-08-04 16:34  ft61  阅读(20)  评论(0编辑  收藏  举报