首页 > 其他分享 >【决策单调性】P3648 [APIO2014] 序列分割 题解

【决策单调性】P3648 [APIO2014] 序列分割 题解

时间:2024-12-14 16:44:24浏览次数:11  
标签:le P3648 int 题解 sum mid APIO2014 dp op

题目链接:P3648 [APIO2014] 序列分割

(注:由于本题解的状态转移方程需要用到 \(k\),所以原题中的 \(k\) 对应本题解中的 \(m\)。)

给你一个长度为 \(n\) 的序列 \(A_1,A_2,...,A_n\),一开始把它看作一个块。初始你的分数为 \(0\),现在你需要进行下列操作恰好 \(m\) 次:

  • 选一个块,并从一处断开,使得断开的两个块不为空。此时这两个块里的数的和的乘积将加到你的分数里。

求最终分数的最大值,并输出断开的位置。

\(2 \le n \le 10^5,1\le m\le\min\{n-1,200\},0\le A_i\le 10^4\)。


转化

这个分数的计算有点绕啊!我们考虑一下两个位置 \((i,j)\) 的贡献吧:不难发现,当且仅当这两个位置最终不在一个块内时,对答案产生 \(A_i \times A_j\) 的贡献。

还是很难算,每个位置要统计一下外面所有位置的贡献。那直接反过来不就好了,我们直接累加每个块内的和的平方。那么答案就是:

\[\frac{(\sum_{i=1}^{n} A_i)^2-sum}{2} \]

于是我们就成功把原问题转化为了这么一个问题:

有一个长度为 \(n\) 的序列,现在要将序列划分为 \(m+1\) 段,最小化各段和的平方之和。

DP

考虑 dp,设 \(f_{k,i}\) 表示第 \(k\) 段的末尾是 \(i\),当前的总和的最小值。

则有

\[f_{k,i}=\min_{k\le j\le i}\{f_{k-1,j - 1} + (\sum_{l=j}^i A_l)^2\} \]

此时 \(f_k\) 是有决策单调性(即 \(i<j\) 两个位置的决策点 \(op_i\le op_j\))的,下面讲讲为什么:

四边形不等式与决策单调性

假设我们要解决如下一类问题:

\[f_{i} = \min_{1\le j \le i} w(i,j) \]

若对于 \(a<b<c<d\),有

\[w(a,c)+w(b,d)\le w(a,d)+w(b,c) \]

那么称函数 \(w\) 满足「四边形不等式」。此时 \(f_i\) 具有决策单调性。证明不再赘述,想了解可以前往 OI Wiki - 四边形不等式优化

回到这题,假设当前外层循环是 \(k\),我们令 \(w(i,j)\) 表示 \(f_{k,i - 1} + \sum_{l=j}^i A_l)^2\)。那么它是否满足四边形不等式呢?

假设有四个位置 \(a\le b\le c\le d\),并且有

\[\begin{cases} X=\sum_{a\le i < b} A_i\\ Y=\sum_{b\le i\le c} A_i\\ Z=\sum_{c < i\le d} A_i \end{cases} \]

\[\begin{aligned} w(a,c)+w(b,d)&=f_{k,a-1}+(X+Y)^2+f_{k,b-1}+(Y+Z)^2\\ &=f_{k,a-1}+f_{k,b-1}+X^2+2Y^2+Z^2+2XY+2YZ\\ \\ w(a,d)+w(b,c)&=f_{k,a-1}+(X+Y+Z)^2+f_{k,b-1}+Y^2\\ &=f_{k,a-1}+f_{k,b-1}+X^2+2Y^2+Z^2+2XY+2YZ+2ZX \end{aligned} \]

所以有

\[w(a,c)+w(b,d) \le w(a,d)+w(b,c) \]

即 \(w\) 满足四边形不等式,故 \(f_k\) 具有决策单调性。


所以就可以放心分治优化 dp 了。对于每次递归 \((l,r,x,y)\) 表示 \([l,r]\) 的 dp 值待计算,并且决策点位于 \([x,y]\)。每次遍历 \([x,y]\),计算 \(mid=\lfloor\frac{l+r}{2}\rfloor\) 位置的 dp 值,然后递归 \((l,mid-1,x,op_{mid})\) 和 \((mid+1,r,op_{mid},y)\)。

时间复杂度 \(O(mn\log n)\)。

// Author: Aquizahv
#include <bits/stdc++.h>
#define ll long long
#define sq(x) (x) * (x)
using namespace std;
const int N = 1e5 + 5, M = 205;
int n, m, a[N], k, op[M][N];
ll sum[N], dp[M][N];

ll cal(int l, int r)
{
    return sq(sum[r] - sum[l - 1]);
}

void solve(int l, int r, int x, int y)
{
    int mid = (l + r) >> 1;
    for (int i = x; i <= y && i <= mid; i++)
    {
        ll w = dp[k - 1][i - 1] + cal(i, mid);
        if (dp[k][mid] > w)
        {
            dp[k][mid] = w;
            op[k][mid] = i;
        }
    }
    if (l < mid)
        solve(l, mid - 1, x, op[k][mid]);
    if (mid < r)
        solve(mid + 1, r, op[k][mid], y);
}

int main()
{
    cin >> n >> m;
    m++;
    for (int i = 1; i <= n; i++)
        scanf("%d", a + i), sum[i] = sum[i - 1] + a[i];
    memset(dp, 0x3f, sizeof(dp));
    dp[0][0] = 0;
    for (k = 1; k <= m; k++)
        solve(1, n, 1, n);
    cout << (sq(sum[n]) - dp[m][n]) / 2 << endl;
    vector<int> res;
    int pre = op[m][n] - 1;
    for (k = m ; k > 1; k--)
    {
        res.push_back(pre);
        pre = op[k - 1][pre] - 1;
    }
    while (!res.empty())
    {
        printf("%d ", res.back());
        res.pop_back();
    }
    return 0;
}

标签:le,P3648,int,题解,sum,mid,APIO2014,dp,op
From: https://www.cnblogs.com/aquizahv/p/18606907

相关文章

  • ARC132E题解
    简要题意有\(n\)个方块,每个方块有一个初始状态可能为左右或者空。每次操作随机选择一个空进行操作。每次操作可以向左或者向右走一直到下一个空或者走出边界,走到的每个格子会变成左或者右,这取决于移动方向。求无法操作时方格为左的期望数。数据范围:\(n\le10^5\)。题解首先......
  • 2024年12月GESPC++三级真题解析
    一、单选题(每题2分,共30分)题目123456789101112131415答案BDAADBCAADDCDCA1.下列二进制表示的十进制数值分别是()[10000011]原=()[10000011]补=()A.-125,-3B.-3,-125C.-3,-3D.-125,-125【答案】B【考纲知识点】原码和补码的计算及转换【......
  • P10370 「LAOI-4」Mex Tower (Hard ver.) 题解
    有一定难度的思维题。题目传送门思路首先,\(\operatorname{mex}(x,y)\)的结果一定为\(0,1,2\),因为只有两个数,所以结果最多为\(2\)(\(x=1,y=0\)或\(x=0,y=1\)时)。因此,可以将问题转化为最后的数是否为\(2\)。考虑倒推,当\(n=1\)时,显然只能为\(2\);要从\(n=2\)的情况变为......
  • P10433 [JOISC 2024 Day2] 棋盘游戏 题解
    Description有一个供\(K\)个玩家玩的棋盘游戏。该游戏的棋盘由\(N\)个编号从1到\(N\)的单元格和\(M\)条编号从1到\(M\)的路径组成,其中路径\(j\)(\(1≤j≤M\))双向连接着单元格\(U_j\)和\(V_j\)。棋盘上有两种类型的单元格:重新激活单元格和停止单元格。这些......
  • P8998 [CEOI2022] Prize 题解
    Description这是一道交互题。Tomislav在睡梦中想到了一个问题:给定两棵大小为\(N\)的树,树上的节点按\(1\simN\)分别编号,树则分别编号为树\(1\),树\(2\),树有边权,但是边权被隐藏了起来。Tomislav需要向交互库提供一个大小为\(K\)的编号的子集\(S\),在选择了这个集合后,小......
  • uniapp的uview2.0框架u--textarea组件(或uv-ui uv-textarea)(或uviewui u--textarea)无法
    问题描述在使用uniapp的uview2.0框架u–textarea组件时,想要使u–textarea支持换行输入,但是默认不支持换行输入,各种百度,没有找到解决问题的方案,最后只有查看源码如下但发现源码没有对属性有过多的处理,我开始怀疑是不是原生组件又问题,但是测试之后发现原生组件并没有问题,经过一天......
  • 【Adutodesk安装无法完成,错误103 问题解决】
    1、工具包 AutodeskInstaller下载:我用夸克网盘分享了「Autodesk103错误工具包」链接:https://pan.quark.cn/s/0889a02a12ec2、问题尝试安装Autodesk产品时,安装失败并显示以下错误:安装错误:[程序名称]安装无法完成。错误103 3、原因原因包括但不限于:(Autodesk大部......
  • 【秋招笔试-支持在线评测】11.13花子_海外版秋招(已改编)-三语言题解
    ......
  • uniapp在平板上启动图片被拉伸变形问题解决
    解决方法使用.9.npg格式图片,.9.PNG是安卓开发里面的一种特殊的图片,这种格式的图片通过ADT自带的编辑工具生成,使用九宫格切分的方法,使图片支持在android环境下的自适应展示。工具.9.npg制作工具draw9png下载地址https://wwvz.lanzouw.com/ixDXP2hzpubg使用方法下载解压draw......
  • 网站乱码如何修改代码,网站乱码问题解决指南
    网站出现乱码通常是由于字符编码不一致导致的。以下是解决网站乱码问题的步骤:确定字符编码:确定网站使用的字符编码。常见的编码有UTF-8、GBK、GB2312等。修改HTML文件:打开网站的HTML文件。使用代码编辑器找到或添加以下代码,确保charset属性设置为正确的字符编码:<m......