首页 > 其他分享 >洛谷P8060 [POI2003] Sums

洛谷P8060 [POI2003] Sums

时间:2022-10-18 22:13:46浏览次数:88  
标签:le 洛谷 子段 int Sums 段数 POI2003 划分 单调

题目链接

题意

给定序列 \(a_1,a_2,\cdots,a_n\) ,将其划分为若干段,要求子段和单调不增,求最大段数。

数据范围:\(1\le n\le 10^5,1\le a_i\le 10^4\) 。

题解

考虑逆推。问题转化为:
给定序列 \(a\) ,将其划分为若干段,使子段和单调不减。

我们记 \(f_i\) 表示前 \(i\) 个元素能划分成的最大段数。

可以注意到一条性质:\(f\) 单调不减。
考虑 \(f_i\) 对应的划分方案,在此基础上直接把 \(a_{i+1}\) 丢到最后一个子段里,段数不变。于是显然有 \(f_{i+1}\ge f_i\) 。

事实上,如果我们一开始就顺推的话,这个性质就不成立了。
比如 \(3,2,1\) 可以分成 \(3\) 段,但是 \(3,2,1,114514\) 只能分成一段。

本质上是因为 \(a_i>0\) 的条件破坏了对称性,使得逆推做法变容易了,但是对顺推没有帮助。
这也是本题要逆推的原因。

回到原题,易知转移方程为 \(\displaystyle f_i=\max_{1\le j<i}\{f_j+1\}\) 。其中 \(j\) 还要满足一个与子段和有关的约束条件。

为了写出这个约束条件,我们设:
\(s_i\) 表示前缀和 \(a_1+\cdots+a_i\) 。
\(g_i\) 表示 \(f_i\) 对应的划分方案中,最后一个子段的元素和。

那么约束条件就是 \(g_j\le s_i-s_j\) 。

容易发现,对于同一个 \(f_j\) ,我们希望 \(g_j\) 最小。

转移之后得到的 \(g_i\) 值为 \(s_i-s_j\) ,我们希望它最小。也就是 \(s_j\) 最大,也就是 \(j\) 最大。

此外,由于 \(f\) 单调不减,\(j\) 最大时 \(f_j\) 也是最大的,那么此时的转移一定是最优解。

至此可以写出最终的转移方程:\(\begin{cases}f_i=f_j+1\\g_i=s_i-s_j \end{cases}\) ,其中 \(j<i,g_j+s_j\le s_i\) ,且 \(j\) 取最大值。

直接实现的话是 \(O(n^2)\) 的,还不能得到满分。

但再稍微思考一下就会发现,这个 dp 可以很方便地加上一个单调队列优化,然后就变成 \(O(n)\) 的了,就过掉了。

代码

View Code
#include<stdio.h>

const int N=1e5+5;

int n,l,r,a[N],s[N],f[N],gs[N],Q[N];

int main() {
    scanf("%d",&n);
    for (int i=1; i<=n; ++i)
        scanf("%d",a+i);
    for (int i=n; i; --i) {
        s[i]=s[i+1]+a[i];
        while (l<r&&gs[Q[l+1]]<=s[i]) ++l;
        f[i]=f[Q[l]]+1,
        gs[i]=(s[i]<<1)-s[Q[l]];
        while (l<=r&&gs[i]<=gs[Q[r]]) --r;
        Q[++r]=i;
    }
    printf("%d\n",f[1]);
    return 0;
}

标签:le,洛谷,子段,int,Sums,段数,POI2003,划分,单调
From: https://www.cnblogs.com/REKonib/p/16804383.html

相关文章

  • 洛谷P1928 外星密码
    一波小解释本人第一次写博客,单纯是为了记录,可能只有自己能看懂哈哈,第一次语法格式什么的还把握不好希望谅解。外星密码题目描述有了防护伞,并不能完全避免2012的灾难......
  • 洛谷 P8268 [USACO22OPEN] Alchemy B 题解
    Part0题意简述原题给出拥有的金属数量与金属配方,求金属\(N\)最大能合成的数量。Part1题目分析首先,金属\(i\)能配出的最大数量只和它的原数量和它的配方中能合......
  • 洛谷 题解 P1572 计算分数
    题目描述Csh被老妈关在家里做分数计算题,但显然他不愿意坐这么多复杂的计算。况且在家门口还有Xxq在等着他去一起看电影。为了尽快地能去陪Xxq看电影,他把剩下的计算题......
  • 洛谷 P8162
    考虑我们的决策肯定是先按\(B_i\)大小在几个州赢得协作者,然后再在剩下的几个州里赢得选票。下文记\(S\)为赢得协作者的州的集合,\(T\)为赢得选票的州的集合。按\(B_......
  • 洛谷 P4035
    #include<bits/stdc++.h>usingnamespacestd;constintN=250;intn;doublea[N][N],x[N],p[N][N],q[N][N];voidgauss(){for(inti=1;i<=n;i+......
  • 在洛谷水的时候找到了一只批, 所以贺了亿点图
    希望他不删掉下面是德狗......
  • 洛谷 P8569 [JRKSJ R6] 第七学区
    洛谷传送门好题,吹爆JRKSJ!考虑朴素的\(O(n\logV)\)做法。枚举第\(i\)位,需要计算所有极长连续的全\(0\)区间长度,答案为\(\sum\limits_{i=0}^{63}2^i\times(\f......
  • 【洛谷】P8256 [NOI Online 2022 入门组] 字符串(dp)
    原题链接题意给定两个由0,1,-组成的字符串\(S\),\(T\),以及一个空串\(R\)。\(S\)的长度为\(n\)。现在要进行\(n\)次操作,每一次操作取出\(S\)的第一个字符\(c\)......
  • 洛谷 P2766【网络流】【线性DP】
    摘自网络流\(24\)题官方题解。第一问:直接\(O(n^2)\)DP求解最长不下降子序列即可。第二问:使用类似于酒店之王的思想,将点\(i\)拆成两个点\(i_1\),\(i_2\)。然后......
  • 洛谷 P8572【暴力】【根号分治】
    根号分治。需要进行分类讨论:当\(n\lek\)的时候,可以进行暴力\(\#1\):暴力求出数组所有区间的最大值。(需要使用前缀和)否则,可以使用一个叫做“记忆化”的鬼玩意。如......