6

https://www.luogu.com.cn/problem/P9596

只需维护 \(s_i=\sum_{j<i}[a_j>a_i]\) 的最大值即可。可以树套树,但是太困难了。

注意到有用的只有所有后缀最小值的位置,所以可以把上述式子改写成 \(s_i=\sum_j[a_j>a_i]-(n-i)\),这样不会把任何一个 \(s\) 变大,同时也没有更改所有后缀最小值位置的 \(s\) 的值。这就可以单 \(\log\) 维护了。

https://qoj.ac/problem/7945

有一个非常牛的事情,一个序列经过若干轮冒泡之后的结果是可以直接刻画的。具体地,序列 \(a\) 经过 \(k\) 轮冒泡后,\([1,p]\) 内的所有数就是原序列中 \([1,p+k]\) 内前 \(p\) 小的数。

证明:一方面,一个数在一轮冒泡过后,位置至多只会往左移动 \(1\),所以在 \(k\) 轮冒泡后 \([1,p]\) 内的数一定来自原序列的 \([1,p+k]\) 这个区间。另一方面,如果把整个序列在 \(p+k\) 处截断,那么 \(k\) 轮冒泡后,最大的 \(k\) 个数一定会被移动到最后面的 \(k\) 个位置。于是证毕。

然后只要主席树维护即可。

其实去年我做过这个题,但是当时题解写得超级复杂,感觉完全没有摸到本质。

https://www.luogu.com.cn/problem/P8425

显然对于一个合法的序列,要么最小值在两端之一,要么最大值在两端之一。所以可以设计一个 dp,设 \(dp_{l,r,x}\) 表示区间 \([l,r]\) 内填的数在 \([x,x+r-l]\) 范围内,最少的移动数量。可以获得 59 分。

考虑以另一种方式来刻画这个 dp,它相当于,平面上有 \(n\) 个关键点,一个正方形合法当且仅当它有至少一个顶点是关键点,你需要选出尽可能多的正方形,使得它们两两包含。

注意到数据随机。不知道应该怎么发现,随机数据下答案是不大的,只有根号级别。所以我们可以将值域定义域互换,设 \(dp_{i,j,k}\) 表示顶点为 \((i,p_i)\),向 \(k\)\(0\le k\le 3\))方向延申,包含 \(j\) 个小正方形的正方形,边长最小是多少。这样复杂度就可以做到 \(O(n^2\sqrt n)\) 了,但还不足以通过。

注意到转移可以写成二维偏序的形式。于是复杂度变成 \(O(n\sqrt n\log n)\) 了。

这题要写八个二维偏序,下周再写!

https://codeforces.com/contest/2138/problem/E2

通过观察样例,可以大胆猜测答案可以是一个宽度为 \(3\) 的对角线。于是问题转化为:构造一个长度为 \(m\)\(\pm1\) 序列 \(a\),使得序列 \(f_i=f_{i-1}+a_if_{i-2}\) 的第 \(m\)\(f_m=n\)

场上想到这里就不会了。天才地考虑倒过来做!钦定 \(f\) 均为正数,那么 \(f_i=|f_{i+1}-f_{i+2}|\),所以确定 \(f_{m-1}\) 后,整个 \(f\) 序列也就确定了。所以我们需要选出一个 \(f_{m-1}=x\),使得 \(x\)\(n\) 做辗转相减的次数比较少。

考虑直接随一个与 \(n\) 互质的 \(x\),可以通过 E1。

考虑斐波那契数列的相邻两项做辗转相减的次数就非常少。所以直接从 \(0.618\times n\) 开始,从小到大枚举 \(x\)。不知道为什么能过,但是就是能过。

https://www.luogu.com.cn/problem/P12447

先随便选一个根,可以用一遍 sort 求出每个点的深度。

考虑从浅到深往树上加点。在加入一个点 \(x\) 时,从浅到深依次确定 \(x\) 的祖先链,这样做的询问次数是 \(O(n^2)\) 的。注意到如果 \(maxd_i<dep_x-1\),那么 \(i\) 不可能是 \(x\) 的祖先。可以证明加入这个优化后询问次数是 \(O(n\sqrt n)\) 的。

\(O(n\log n)\) 的做法非常宇宙!还是一个一个往树上加点,考虑边分治,每次在已确定的树上选出一条边劈成两半,可以通过一次询问确定待加入的点在哪一半。然后就做完了!

posted @ 2025-09-07 12:12  Egg_eating_master  阅读(15)  评论(0)    收藏  举报