发现两个原题,举办了举办了。
T1
这个题原题,搞两个树状数组就好了。
T2
我以为是个贪心,结果下来是dp(赛时没有hack了自己的贪心哪里不对,只知道大样例每跑过(
我们用 \(dp_{i, j}\) 表示在前 \(i\) 个椰子中选择了 \(j\) 个椰子最少需要砸多少下。
然后枚举我们下一个要选择哪个位置的椰子,这个时候,我们至少需要砸 \(\sum_{k<i}(k - i ) \times a_i\) 转移方程就呼之欲出 $ f_{i, j} \gets min_{k < i}(f_{i, j}, (i - k)\times a_i + f_{k, j-1})$
然后我们便可以用单调栈来维护,最后缩减复杂度。
fos(j, 2, m)
{
ll hh, tt; hh = tt = 0;
q[++ hh] = 0, q[ ++ tt] = j - 1;
fos(i, j, n)
{
while(hh < tt && get(q[tt], j - 1) - get(q[tt - 1], j - 1) >= w[i] * (q[tt] - q[tt - 1])) -- tt;
ll k = q[tt];
f[i][j] = f[k][j - 1] + (i - k) * w[i];
while(hh < tt && (get(q[tt - 1], j - 1) - get(q[tt], j - 1)) * (q[tt] - i) >= (get(q[tt], j - 1) - get(i, j - 1)) * (q[tt - 1] - q[tt])) -- tt;
q[ ++ tt] = i;
}
}
fos(i, m, n) ans = min(ans, f[i][m]);
T3
这个题原题,不多赘述。
T4
同昨天
标签:原题,++,tt,get,fos,hh,10.13,模拟 From: https://www.cnblogs.com/carp-oier/p/17762988.html