2022.11.02

2022.11.02

T1 P6503

单调栈维护 \(4\) 个值:令当前数为 \(i\), 维护 \(i\) 往前第一个大于/小于 \(a_i\) 的数的位置和 \(i\) 往后第一个大于/小于 \(a_i\) 的数的位置 ,枚举每一个数的贡献即可,注意一下去重的细节(可以规定做出贡献的最小值为所有相同的最小数中位于区间最左侧的,最大值同理) 其实相当于之前某天清橙上的T1

T2 P4951

比较裸的 0/1分数规划,做过类似题目的话这题不难。
可以推出要使得答案 \(ans\) 合法,就要保证所有选出的路中 \(\sum {c_i + t_i \cdot ans} \le f\)
二分这个 \(ans\) 跑最小生成树就好了。

T3 P3509

倍增好题,让我更深刻地理解了倍增。(阿同时也有双指针的成分)
做的时候想到了 倍增 两个字,除此之外什么都没想出来。
首先在求 第i个位置跳1步到达的点 时,双指针(相当于一个区间)总是向后移动(或不移动),因为位置 \(i + 1\) 到 当前 \(l\) 的距离总是在增大,双指针向后移动才有可能使得答案更优。
处理完这玩意就可以用倍增求答案了。
\(m\) 二进制分解,令 \(f_{i,j}\) 表示 \(i\) 位置跳 \(2^j\) 次后的位置(\(f_{i,0}\)已求出),则有转移方程 \(f_{i,j} = f_{f_{i,j-1},j-1}\)。在 \(m\) 的二进制中“1”的对应位置将 \(f\) 更新到 \(ans\) 中就彳亍了。数组滚动一下,就会发现答案的更新特别像快速幂的求法。

T4 P7365

一道神奇的有关网格的DP(一些大佬称其为暴力DP)。
这里将 “I” 字母分为的三个部分称为第一,二,三部分。

做法:设 \(f_{i,j,k,l}(l \in [1,3])\) 表示第 \(i\) 行,当前在第 \(l\) 部分,区间 \([j,k]\)的最大面积。
由于第二部分必须比第一部分短一截,在暴力的时候就得在枚举第一部分的 \(j,k\) 时枚举第二部分的 \(j,k\),pia的一下 \(n^4\) 了。
于是出现了一个小技巧:使用另一个数组 \(g_{i,j,k,l}(l \in [1,2])\)
\(g_{i,j_g,k_g,1}\) 记录 \(f_{i,j_f,k_f,1} | j_f \in [1,j_g), k_f \in (k_g,m]\)的最大值,
\(g_{i,j_g,k_g,2}\) 记录 \(f_{i,j_f,k_f,2} | j_f,k_f \in (j_g,k_g)\)的最大值,
这样在不同部分的转移中就可以直接调用 \(g\) 数组而不用枚举 \(j_g,k_g\) 了。
最后我们会发现 \(i\) 这一维可以被轻松地压掉,但好像可以不压。

posted @ 2022-11-03 18:33  Cotsheep  阅读(24)  评论(0编辑  收藏  举报