qoj8225 最小值之和 题解

news/2024/10/6 3:34:55/文章来源:https://www.cnblogs.com/Farmer-djx/p/18288406

题目链接

点击打开链接

题目解法

很牛的题啊

\(f\) 序列的最小值切入,考虑把 \(f_i:=f_i-f_{min}\),会对 \(f'\) 造成什么影响?
发现会使 \(f'\) 中的每个数都减去 \((n-1)f_{min}\),且会把原问题分成 \([1,min]\)\([min+1,r]\) 这两个完全相同的子问题

于是考虑区间 \(dp\),令 \(dp_{l,r,v}\) 表示当前操作 \([l,r]\) 这个区间,\(f'_i(l\le i\le r)\) 都减去了 \(v\),是否可以构造出一组合法的 \(f\)
只要存在 \(dp_{l,k,v+q\times (r-l)}\)\(dp_{k+1,r,v+q\times (r-l)}\) 都为 \(1\)\(dp_{l,r,v}\) 就为 \(1\)

需要发现一个结论:如果 \(dp_{l,r,v}=1\),则 \(dp_{l,r,v-(r-l)}=1\),证明由转移方程可推得

根据这个结论,我们重新定义 \(g_{l,r,c}(0\le c<r-l)\) 表示对于所有 \(c\equiv v(\bmod r-l)\),且 \(dp_{l,r,v}=1\) 的最大的 \(v\)
转移枚举 \(k\),及左右的 \(c\)
我们需要找到最大的满足 \(x\equiv g_{l,k,c_1}(\bmod k-l)\)\(x\equiv g_{k+1,r,c_2}(\bmod r-k-1)\),且 \(x\le \min\{g_{l,k,c_1},g_{k+1,r,c_2}\}\)\(x\)
然后一直往前跳 \(x\) 更新 \(g\),知道出现 \(x\%(r-l)\) 相同的结束

时间复杂度 \(O(n^5)\)

#include <bits/stdc++.h>
#define F(i,x,y) for(int i=(x);i<=(y);i++)
#define DF(i,x,y) for(int i=(x);i>=(y);i--)
#define ms(x,y) memset(x,y,sizeof(x))
#define SZ(x) (int)x.size()-1
#define all(x) x.begin(),x.end()
#define pb push_back
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
typedef pair<int,int> pii;
template<typename T> void chkmax(T &x,T y){ x=max(x,y);}
template<typename T> void chkmin(T &x,T y){ x=min(x,y);}
template<typename T> void read(T &FF){FF=0;int RR=1;char ch=getchar();for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;FF*=RR;
}
const int N=85;
int n,g[N],ans[N];
array<int,2> f[N][N][N];
void print(int l,int r,int v,int c1,int c2){auto [to,k]=f[l][r][v];ans[k]=(to-c1)/(r-l)+c2;if(l!=k) print(l,k,to%(k-l),to,ans[k]);if(k+1!=r) print(k+1,r,to%(r-k-1),to,ans[k]);
}
void upd(array<int,2> &ff,int x,int y){ if(x>ff[0]) ff[0]=x,ff[1]=y;}
int main(){read(n);F(i,1,n) read(g[i]);if(n==1){ puts(g[1]?"No":"Yes");exit(0);}ms(f,-1);F(i,1,n-1) if(g[i]==g[i+1]) f[i][i+1][0]={g[i],i};F(len,3,n) F(l,1,n-len+1){int r=l+len-1;if(f[l][r-1][g[r]%(r-1-l)][0]>=g[r]) upd(f[l][r][g[r]%(r-l)],g[r],r-1);if(f[l+1][r][g[l]%(r-1-l)][0]>=g[l]) upd(f[l][r][g[l]%(r-l)],g[l],l);F(k,l+1,r-2){int t=lcm(k-l,r-k-1);F(j,0,t-1){int p=min(f[l][k][j%(k-l)][0],f[k+1][r][j%(r-k-1)][0]);if(p==-1||p<j) continue;p=(p-j)/t*t+j;int st=p%(r-l);while(true){upd(f[l][r][p%(r-l)],p,k);p-=t;if(p<0||p%(r-l)==st) break;}}}}if(f[1][n][0][0]==-1){ puts("No");exit(0);}print(1,n,0,0,0);puts("Yes");F(i,1,n-1) printf("%d ",ans[i]);puts("");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/739744.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最新扣子(Coze)实战案例:图像流工具之空间风格化,完全免费教程

🧙‍♂️ 大家好,我是斜杠君,手把手教你搭建扣子AI应用。 📜 本教程是《AI应用开发系列教程之扣子(Coze)实战教程》,完全免费学习。 👀 免费扣子Coze教程地址:https://www.bzfree.com/如果想学习AI应用搭建,请关注公众号,及时获取最新免费教程。 上节课讲了人像风格…

认识终端和shell

【教程】在macOS上用VSCode写C++代码 4 认识终端和shell 内建程序与内建命令 打开终端,其实相当于打开了shell。shell 可以运行一些程序(例如 sayhello、 /bin/mkdir )。 shell自身也带着一些程序(二进制可执行文件),这些程序就叫内建程序。 特点:调用shell内建程序的时…

LVGL一键打包图片工具,全部图片打包成一个bin文件,支持nor flash XIP模式下直接访问数据显示

最近做工程项目,需要用到LVGL,但是搜了很长时间没有看到合适的图片打包工具,大多都是生成数组或者单个的bin文件,这样烧录到nor flash很麻烦 后来看到一篇博客,博主的想法与我类似,不过他后面部分就做的麻烦了,所以,我直接从头写了一个工具,他的博客地址:https://www…

mini-lsm通关笔记-字符相关操作

本文捋一下mini-lsm中的字符相关操作[u8] Vec<u8> Bytes Buf KeySlice KeyBytes[u8]和Vec<u8> 这两个是rust内置的数据类型。 [u8]: 切片本身并不拥有数据,而是引用了数据。它由一个指向数组开始处的指针和一个表示数组长度的计数器组成。[u8]类型通常写作&[u…

张高兴的 MicroPython 入门指南:(二)GPIO 的使用

目录什么是 GPIO使用方法使用微动开关点亮板载 LED硬件需求电路代码参考 什么是 GPIO GPIO 是 General Purpose Input Output 的缩写,即“通用输入输出”。 Raspberry Pi Pico 左右两侧各有一列 GPIO 引脚, Pico 通过这两列引脚进行一些硬件上的扩展,与传感器进行交互等等。…

MySQL-17.其他数据日志

C-17.其他数据日志 在之前的数据库事务的章节中,已经讲过,redo log和undo log。 对于线上数据库应用系统,突然遭遇数据库宕机怎么办?在这种情况下,定位宕机的原因就非常关键。我们可以查看数据库的错误日志。因为日志中记录了数据库运行中的诊断信息,包括了错误,警告和注…

如何恢复SSD NVME固态硬盘的数据恢复

一、使用数据恢复软件 操作步骤(以EaseUS Data Recovery Wizard为例): 安装软件:从EaseUS官网或其他可靠来源下载并安装EaseUS Data Recovery Wizard。 连接固态硬盘:将SSD NVMe固态硬盘连接到电脑上,并确保系统能够识别。 启动软件并选择恢复选项:打开EaseUS Data Reco…

raid5存储池已损毁硬盘数据

RAID 5存储池中的硬盘数据损毁是一个复杂的问题,因为它涉及到数据的冗余、存储方式以及恢复策略。 一、RAID 5的工作原理 RAID 5是一种使用条带化和奇偶校验技术的存储解决方案,它至少需要三个硬盘来构建。在这种配置中,数据和奇偶校验信息被分布在所有硬盘上,以提供数据冗…

SSD NVME固态 硬盘 数据恢复

SSD NVMe固态硬盘数据恢复是一个复杂但并非不可能的任务,以下是一些建议的方法和步骤: 一、了解数据恢复的基本原理 数据恢复的基本原理在于,即使文件在操作系统中被删除或格式化,其实际数据在硬盘的物理介质上可能仍然存在,只是被标记为可覆盖。 SSD NVMe固态硬盘与传统的…

磁盘阵列中raid5坏了一个硬盘数据恢复

RAID5数据恢复步骤包括备份数据、更换故障硬盘、重建RAID阵列和数据恢复注意事项。在恢复过程中,需遵循正确的步骤并保持冷静,不要尝试自行解决复杂的数据恢复问题,以免造成不可逆转的数据损失。完成恢复后,应进行完整性检查和验证。 一、概述 RAID 5是一种存储配置,它将多…

电脑开机检测不到硬盘怎么办 电脑检测不到硬盘问题解决

电脑开机检测不到硬盘,无法进入系统或者显示“Reboot and Select proper Boot device”等错误信息。这种情况可能会导致我们的数据丢失或者无法使用电脑。 一、电脑检测不到硬盘的可能原因 电脑检测不到硬盘的原因主要有以下几种:1、硬盘连接线松动或损坏:硬盘是通过SATA线或…

CentOS 7 下载 网络配置 ssh配置 JDK配置 Python3配置 Git配置 nvm配置 防火墙配置

背景 CentOS 8系统2021年12月31日已停止维护服务,CentOS 7系统将于2024年06月30日停止维护服务。CentOS官方不再提供CentOS 9及后续版本,不再支持新的软件和补丁更新。 所以我们如果要安装服务器操作系统就需要安装centos7。这里我是用虚拟机安装的centos7mini版,mini版本是…