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
等结构简单维护。