2023.9.13 贪心和数据结构

CF1439C

考虑修改操作,由于序列是单调的,所以只需要线段树二分出修改的区间即可。
考虑查询,一定是若干个连续段,设一开始是 \(y\),这个连续段结束后,\(y\) 至少减去一半,所以连续段个数是 \(\log\) 级别。
在线段树上遍历即可。

CF436E

反悔贪心,考虑怎么从 \(w\) 颗星转移到 \(w+1\) 颗星。
1.在空的位置 \(i\) 加上一颗星,代价 \(a_i\).
2.在一颗星的位置 \(i\) 加上一颗星,代价 \(b_i-a_i\).
3.在有一颗星的位置 \(i\) 减去,并在空的 \(j\) 为止加两颗星,代价 \(-a_i+b_j\).
4.在有两颗星的位置 \(i\) 减去一颗,并在空的 \(j\) 为止加两颗星,代价 \(-(b_i-a_i)+b_j\).
维护 \(a_i\)\(b_i-a_i\)\(b_i\)\(-a_i\)\(-(b_i-a_i)\) 几个堆。
每次用最优的操作,并更新堆,删除堆的元素可以打标记。

CF1452G

\(t(x)\) 表示 \(x\) 这个点离最近的 \(B\) 有多远。
考虑 \(A\) 的策略,显然是走到 \(t\) 最大的点去。设 \(t(x)\) 是最大的.
但是可能走不到,必须保证 \(dis(A,x)<t(x)\),就一定能走到。

即我们对于每一个 \(t(u)\),都更新离 \(u\) 距离小于 \(t(u)\) 的所有点,这个可以用点分治解决。

CF625E

先维护相邻的两个点要撞上的步数。
率先撞的一定是编号最小的且步数最少的两个。
当撞了之后,删掉被撞的那个点,继续维护相邻的点。
可以用链表,set 等结构简单维护。

posted @ 2023-09-13 15:29  s1monG  阅读(18)  评论(0编辑  收藏  举报