CF1928E Modular Sequence 题解
考虑合法的答案的构成为一个 \(x,x+y,\dots x+ky\) 的块加上若干个 \(x\bmod y,x\bmod y+y,\dots x\bmod y+ky\) 的块。因为无论加多少次 \(y\),对 \(y\) 进行一次取模就都被消去了。
我们考虑枚举 \(x,x+y,\dots x+ky\) 的块的长度,然后判断剩余的数的总和能否被剩余的位置拼出。这里不判断剩余位置能否拼出剩余的数的总和,因为这个很难预处理,也很难快速计算。
我们把除了第一个块的元素,每一个都减去 \(x\bmod y\),再除以 \(y\),就变成了若干个 \(0,1,\dots k\) 的块。这样的好处是,如果拼出剩余的数的总和的序列长度小于剩余的位置,就可以补入 \(0\) 来占位。
我们记 \(dp[i]\) 为拼出总和为 \(i\) 的序列的最小长度。我们枚举 \(j\),表示新增一个长度为 \(j-1\) 的块,可以使用等差数列求和公式得到这个块的和,容易得到如下转移方程:
\]
由于题目需要输出方案,所以还需要记录每次转移的前驱与新增块的长度,方便输出方案。
时间复杂度为 \(O(s\sqrt{s}+n)\),可以通过。
需要注意,有很多种情况会导致当前枚举的长度不可行,具体可以看代码。
#include <bits/stdc++.h>
using namespace std;
long long t,n,x,y,s,f[300000],pr[300000],pz[300000],a[300000];
int main()
{
scanf("%lld",&t);
while(t--)
{
bool flag=1;
scanf("%lld%lld%lld%lld",&n,&x,&y,&s);
for(int i=0;i<=s;i++)f[i]=1e10,pr[i]=0,pz[i]=0;
f[0]=0;
for(int i=1;i<=s;i++)
for(int j=2;j*(j-1)/2<=i;j++)
if(f[i-j*(j-1)/2]+j<f[i])f[i]=f[i-j*(j-1)/2]+j,pr[i]=i-j*(j-1)/2,pz[i]=j;
for(int i=1;i<=n;i++)
{
long long ns=s-i*x-i*(i-1)*y/2;
if(ns<0)break;
a[1]=x;
for(int j=2;j<=i;j++)a[j]=a[j-1]+y;
ns-=(n-i)*(x%y);
if(ns<0||ns%y!=0)continue;
ns/=y;
if(f[ns]>n-i)continue;
flag=0;
for(int j=i+1;j<=n-f[ns];j++)a[j]=x%y;
long long now=n-f[ns]+1;
while(ns)
{
for(long long j=0;j<pz[ns];j++)a[now+j]=x%y+j*y;
now+=pz[ns];
ns=pr[ns];
}
break;
}
if(flag)printf("NO\n");
else
{
printf("YES\n");
for(int i=1;i<=n;i++)printf("%lld ",a[i]);
printf("\n");
}
}
return 0;
}
CF1928E Modular 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的数列中有多少个满足条件的子序列,条件为子序列中 ...
随机推荐
- 康谋分享 | aiSim5激光雷达LiDAR模型验证方法(二)
aiSim中的LiDAR是一种基于光线追踪的传感器,能够模拟真实LiDAR发射的激光束,将会生成LAS v1.4标准格式的3D点云,包含了方位角.俯仰角和距离等. aiSim能够模拟LiDAR单态(M ...
- 如何在 MySQL 中实现读写分离?
如何在 MySQL 中实现读写分离? 在 MySQL 中实现读写分离主要目的是为了提升数据库的性能和扩展性,将读请求和写请求分配到不同的服务器上,减轻主数据库的压力.通常,写请求会发送到主库,而读请求 ...
- MySQL 参考资料
官方文档:https://dev.mysql.com/doc/refman/5.7/en/ 书: 1.<高性能MySQL> 2.<MySQL是怎样运行的:从根儿上理解MySQL> ...
- python打包exe自定义图标
1.生成.ico图标 https://www.aconvert.com/cn/icon/jpg-to-ico/ 2.打包 pyinstaller -F -w -i 666.ico pdfToword. ...
- 我的C/C++开发环境
我的C/C++开发环境 OS: WSL Ubuntu Compiler: gcc Editor: VS Code Extensions: C/C++ Extenion Pack Settings: 时 ...
- 内网私仓全流程搭建记录(二)-npm私仓提交与拉取
1.npm私仓依赖下载及本地上传 方法一1)使用Pycharm创建py文档,写入如下py代码: import os import re import aiohttp import asyncio fr ...
- Vue技术之“关于sortable排序的使用”
Vue关于sortable排序的使用 方案1 在使用sortable后要注意给el-table-column中加入prop="overdueDays"参数,不然会找不到需要排序的数 ...
- ceph存储介绍
一.ceph简介 ceph是一个开源的.统一的分布式存储系统,设计初衷是提供较好的性能.可靠性和可扩展性.其中"统一"是说ceph可以一套存储系统同时提供块存储设备.文件系统存储和 ...
- 探秘Transformer系列之(33)--- DeepSeek MTP
探秘 Transformer系列之(33)--- DeepSeek MTP 目录 探秘 Transformer系列之(33)--- DeepSeek MTP 0x00 概述 0x01 EAGLE 1. ...
- 应用内存管理:Linux的应用与内存管理
应用程序想要使用内存,必须得找操作系统申请,那就有必要先了解下Linux内核怎么管理内存的,然后再去分析应用程序的内存管理细节. 硬件架构 现代计算机体系结构被称为Non-Uniform Memory ...