10.13模拟赛

发现两个原题,举办了举办了。

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

同昨天

posted @ 2023-10-13 19:33  carp_oier  阅读(13)  评论(0)    收藏  举报