AT_agc049_d [AGC049D] Convex Sequence

限制 \(1\) 不好满足,先不管它。限制 \(2\) 移项可得 \(a_{i}-a_{i-1}\le a_{i+1}-a_{i}\),即差分非严格单调递增,满足要求的序列为一个单谷序列。

我们考虑枚举最左侧的最小值的出现位置,先考虑在最左端的情况。

我们钦定序列最小值为 \(0\),可以通过增加非最左侧的最小值的出现位置的元素的值来构造序列。具体的,我们每次选择一个区间 \([i,n](i\gt 1)\),把这个区间的数从左到右依次增加 \(1,2\dots n-i+1\),这样增量区间的差分不减,原序列的差分也非严格单调递增,构造出来的序列显然满足限制 \(2\)。

接下来就是要证明所有满足要求的序列都可以由上述构造方式得到。这是易证的,钦定最小值之后,每一个合法的区间对应一个唯一的非严格单调递增的差分数组。注意到增量区间的差分实际上都是 \(1\),每次操作后差分区间每个数加 \(1\)。我们从右往左一位一位操作,每次对于位置 \(i\) 操作 \([i,n]\) 直到满足差分数组的限制,注意到这种情况下构造不出来的条件为存在递减的差分,由限制 \(2\) 有差分非严格单调递增,矛盾,所以不会存在这种情况。

考虑到这种总和 \(\le m\) 的段只会有 \(O(\sqrt{m})\) 个,我们直接把这些段预处理出来做容量为 \(m\) 的完全背包。这样,就满足了限制 \(1\)。

注意到最小值可以不为 \(0\),但每次最小值的增加伴随着 \(n\) 个元素一起增加,所以做背包的时候预处理出这种状态记为可行。

接下来考虑最左侧的最小值向右滑动。假设滑动前为 \(i\),滑动后相当于背包里失去了 \([i+1,n]\) 这个元素,增加 \([1,i-1]\) 这个元素。注意到 \([1,i-1]\) 的贡献与后缀 \([n-i+2,n]\) 相同,不需要额外处理。由于统计方案数的背包是支持删除的,可以直接维护。

最后,再统计使最左侧的最小值向右滑动需要的操作的贡献即可,这同样是一个前缀,同上维护。

于是,我们得到了一个时间复杂度 \(O(m\sqrt{m})\) 的算法,空间复杂度 \(O(m)\) 的优秀算法。

#include <bits/stdc++.h>
using namespace std;
long long n,m,k=0,s[200000],f[200000],ans=0;
const long long mod=1e9+7;
int main()
{
scanf("%lld%lld",&n,&m);
while(s[k]<=m)k++,s[k]=s[k-1]+k;
k--;
for(int i=0;i<=m;i+=n)f[i]=1;
for(int i=1;i<=min(k,n-1);i++)
for(int j=s[i];j<=m;j++)f[j]=(f[j]+f[j-s[i]])%mod;
for(int i=1;i<=n;i++)
{
if(i-1>k)break;
ans=(ans+f[m-s[i-1]])%mod;
for(int j=s[i];j<=m;j++)f[j]=(f[j]+f[j-s[i]])%mod;
if(n-i<=k)for(int j=m;j>=s[n-i];j--)f[j]=(f[j]-f[j-s[n-i]])%mod;
}
printf("%lld\n",(ans%mod+mod)%mod);
return 0;
}

Atcoders [AGC049D] Convex Sequence 题解的更多相关文章

  1. 【CF486E】LIS of Sequence题解

    [CF486E]LIS of Sequence题解 题目链接 题意: 给你一个长度为n的序列a1,a2,...,an,你需要把这n个元素分成三类:1,2,3: 1:所有的最长上升子序列都不包含这个元素 ...

  2. CF3D Least Cost Bracket Sequence 题解

    题目 This is yet another problem on regular bracket sequences. A bracket sequence is called regular, i ...

  3. POJ3581:Sequence——题解

    http://poj.org/problem?id=3581 给一串数,将其分成三个区间并且颠倒这三个区间,使得新数列字典序最小. 参考:http://blog.csdn.net/libin56842 ...

  4. BZOJ4355:Play with sequence——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4355 维护一个长度为N的序列a,现在有三种操作: 1)给出参数U,V,C,将a[U],a[U+1] ...

  5. Pop Sequence 题解

    Pop Sequence(PAT) https://www.nowcoder.com/pat/5/problem/4090 前言: PAT上一道Stack的应用题,简化版的有<信息学一本通·普及 ...

  6. CF524F And Yet Another Bracket Sequence 题解

    题目链接 算法:后缀数组+ST表+贪心   各路题解都没怎么看懂,只会常数巨大的后缀数组+ST表,最大点用时 \(4s\), 刚好可以过... 确定合法序列长度   首先一个括号序列是合法的必须满足以 ...

  7. Codeforces 486E LIS of Sequence 题解

    题目大意: 一个序列,问其中每一个元素是否为所有最长上升子序列中的元素或是几个但不是所有最长上升子序列中的元素或一个最长上升子序列都不是. 思路: 求以每一个元素为开头和结尾的最长上升子序列长度,若两 ...

  8. TopCoder SRM 625 Incrementing Sequence 题解

    本题就是给出一个数k和一个数组,包含N个元素,通过每次添加�数组中的一个数的操作,最后须要得到1 - N的一个序列,不用排序. 能够从暴力法入手,然后优化. 这里利用hash表进行优化,终于得到时间效 ...

  9. HDU5306:Gorgeous Sequence——题解

    http://acm.hdu.edu.cn/showproblem.php?pid=5306 给一个数组,m次操作: 1:l r x,将a[i](l<=i<=r)=min(a[i],x) ...

  10. 多校第九场Arithmetic Sequence题解

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=5400 题意:给定等差数列的差值d1,d2.问长度为n的数列中有多少个满足条件的子序列,条件为子序列中 ...

随机推荐

  1. DelayQueue 底层原理

    一.DelayQueue 底层原理 DelayQueue是一种本地延迟队列,比如希望我们的任务在5秒后执行,就可以使用DelayQueue实现.常见的使用场景有: 订单10分钟内未支付,就取消. 缓存 ...

  2. MySQL 索引的最左前缀匹配原则是什么?

    MySQL 索引的最左前缀匹配原则 最左前缀匹配原则是 MySQL 使用联合索引时的一个重要优化规则.它指的是在查询条件中,只有符合索引最左侧字段开始的连续前缀部分时,索引才能被有效利用. 1. 最左 ...

  3. Java 中的 young GC、old GC、full GC 和 mixed GC 的区别是什么?

    Java 中的 young GC.old GC.full GC 和 mixed GC 的区别 在 Java 中,垃圾回收(GC)可以分为几种不同类型,包括 young GC.old GC.full G ...

  4. react项目vite报错:UnhandledPromiseRejectionWarning: SyntaxError: Unexpected token '??='

    问题: vite报错:UnhandledPromiseRejectionWarning: SyntaxError: Unexpected token '??=' 今天clone一个vite的项目,安装 ...

  5. 查阅相关资料, 了解什么是scrum中的3355?

    在Scrum中,3355是一个用于描述其核心组成部分的模型,具体包括三个核心角色.三个工件.五个关键事件和五个价值观.下面是对Scrum中3355的详细解释: 三个核心角色 产品负责人(Product ...

  6. GSLibrary平台本地搭建(windows)

    一.安装配置数据库 https://dev.mysql.com/downloads/windows/installer/5.7.html 创建GSLibrary数据库 mysql -uroot -p ...

  7. Linux 常识和操作(常用命令)

    1. 存放用户账号的文件在哪里? /etc/passwd 2. 如何删除一个非空的目录? rm -rf 目录名 3. 查看当前的工作目录用什么命令? pwd 4. 创建一个文件夹用什么命令? mkdi ...

  8. C#8.0,9.0,10.0常见新语法学习

    顶级语句 (1)一个项目最多只能有一个文件具有顶级语句,就是直接写代码,如果存在多个,则会报错, (2)如果顶级语句和Main共存,则只调用顶级语句 (3)如果没有顶级语句,则必须有Main 简化us ...

  9. K8s进阶之多租户场景下的资源配额(ResourceQuota)

    概述 ResourceQuota官方文档:https://kubernetes.io/zh-cn/docs/concepts/policy/resource-quotas/ 在 Kubernetes( ...

  10. java list<对象>根据某个字段分组

    前言 仅供学习参考,不保证性能问题 其中的实体类改成你自己的实体类 代码 /** * 根据某个字段进行分组,分组后遍历方法 * <p> * Map<String, List<M ...