Atcoders [AGC049D] Convex Sequence 题解
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 题解的更多相关文章
- 【CF486E】LIS of Sequence题解
[CF486E]LIS of Sequence题解 题目链接 题意: 给你一个长度为n的序列a1,a2,...,an,你需要把这n个元素分成三类:1,2,3: 1:所有的最长上升子序列都不包含这个元素 ...
- CF3D Least Cost Bracket Sequence 题解
题目 This is yet another problem on regular bracket sequences. A bracket sequence is called regular, i ...
- POJ3581:Sequence——题解
http://poj.org/problem?id=3581 给一串数,将其分成三个区间并且颠倒这三个区间,使得新数列字典序最小. 参考:http://blog.csdn.net/libin56842 ...
- BZOJ4355:Play with sequence——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4355 维护一个长度为N的序列a,现在有三种操作: 1)给出参数U,V,C,将a[U],a[U+1] ...
- Pop Sequence 题解
Pop Sequence(PAT) https://www.nowcoder.com/pat/5/problem/4090 前言: PAT上一道Stack的应用题,简化版的有<信息学一本通·普及 ...
- CF524F And Yet Another Bracket Sequence 题解
题目链接 算法:后缀数组+ST表+贪心 各路题解都没怎么看懂,只会常数巨大的后缀数组+ST表,最大点用时 \(4s\), 刚好可以过... 确定合法序列长度 首先一个括号序列是合法的必须满足以 ...
- Codeforces 486E LIS of Sequence 题解
题目大意: 一个序列,问其中每一个元素是否为所有最长上升子序列中的元素或是几个但不是所有最长上升子序列中的元素或一个最长上升子序列都不是. 思路: 求以每一个元素为开头和结尾的最长上升子序列长度,若两 ...
- TopCoder SRM 625 Incrementing Sequence 题解
本题就是给出一个数k和一个数组,包含N个元素,通过每次添加�数组中的一个数的操作,最后须要得到1 - N的一个序列,不用排序. 能够从暴力法入手,然后优化. 这里利用hash表进行优化,终于得到时间效 ...
- 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) ...
- 多校第九场Arithmetic Sequence题解
题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=5400 题意:给定等差数列的差值d1,d2.问长度为n的数列中有多少个满足条件的子序列,条件为子序列中 ...
随机推荐
- Clion搭建C语言开发环境
1.下载和安装MinGW 1)下载链接:http://www.mingw.org/ 2)选择安装目录,目录尽可能简单(如:D:\MinGW)且不要包含中文和空格 3)添加相关的包 所需的包如下:min ...
- 一文速通 Python 并行计算:07 Python 多线程编程-线程池的使用和多线程的性能评估
一文速通 Python 并行计算:07 Python 多线程编程-线程池的使用和多线程的性能评估 摘要: 本文介绍了 Python 线程池(ThreadPoolExecutor)的使用方法,包括线程池 ...
- C# 拓展方法( 二)——模拟拓展方法的场景
namespace ExpandingMethodDemo{ class Program { static void Main(string[] args) { Phone ph = new Phon ...
- 网鼎杯-phpweb
找了一些php读取文件的函数尝试读取源码,试了一个readfile就成功了 <?php $disable_fun = array("exec","shell_exe ...
- Sentinel——热点规则
目录 热点规则 配置热点规则 API配置热点规则 热点规则 热点规则是用于实现热点参数限流的规则.热点参数限流指的是,在流控规则中指定对某方法参数的 QPS 限流后,当所有对该资源的请求URL中携带有 ...
- Tomcat无法启动报错:'Starting Tomcat v9.5 Server at localhost' has encountered a problem
错误提示 控制台提示 严重: A child container failed during start java.util.concurrent.ExecutionException: org.ap ...
- 在鸿蒙Next中开发一个月历组件
最近一直在出差,工作繁忙,很久没有时间更新文章了,连华为开发者大会也错过了.今天周末,忙里偷闲给大家分享一个鸿蒙月历组件. 这样的组件大家在工作中应该经常会遇到,而鸿蒙又没有提供一个这样的系统组件,今 ...
- c#开发完整的Socks5代理客户端与服务端(已完结)
本文我们介绍下如何在Windows系统上开发一个代理本机流量的客户端,并且对接我们之前开发的Socks5服务端,实现整个代理的一条龙.对于Socks5代理的服务端的开发可以详见之前的文章. 目录 本机 ...
- 【SQL 周周练】爬取短视频发现数据缺失,如何用 SQL 填充
大家好,我是"蒋点数分",多年以来一直从事数据分析工作.从今天开始,与大家持续分享关于数据分析的学习内容. 本文是第 5 篇,也是[SQL 周周练]系列的第 4 篇.该系列是挑选或 ...
- C#反射报错之System.Reflection.AmbiguousMatchException:“Ambiguous match found.
.NET6 Type t = typeof(double).GetMethod("TryParse").GetParameters()[1].ParameterType; Cons ...