首页 > 其他分享 >qoj8225 最小值之和 题解

qoj8225 最小值之和 题解

时间:2024-07-07 13:30:06浏览次数:16  
标签:ch min int 题解 void 最小值 qoj8225 dp define

题目链接

点击打开链接

题目解法

很牛的题啊

从 \(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;
}

标签:ch,min,int,题解,void,最小值,qoj8225,dp,define
From: https://www.cnblogs.com/Farmer-djx/p/18288406

相关文章

  • 电脑开机检测不到硬盘怎么办 电脑检测不到硬盘问题解决
    电脑开机检测不到硬盘,无法进入系统或者显示“RebootandSelectproperBootdevice”等错误信息。这种情况可能会导致我们的数据丢失或者无法使用电脑。一、电脑检测不到硬盘的可能原因电脑检测不到硬盘的原因主要有以下几种:1、硬盘连接线松动或损坏:硬盘是通过SATA线或M.2插......
  • 启动应用程序出现wevtutil.exe找不到问题解决
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个wevtutil.exe文件(挑选合适的版本文件)把它......
  • 启动应用程序出现wininit.exe找不到问题解决
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个wininit.exe文件(挑选合适的版本文件)把它放......
  • [SNCPC2024] 2024 年陕西省大学生程序设计 J题猜质数II 题解
    题目链接:CF或者洛谷PS:CF的得等上gym。前提说明其实在上个月就见到这题了,当时很想做这题,结果找不到做题链接,也不知道出处,原来是陕西省赛的捧杯题。个人评价觉得是一道很不错的题,难度适中。讲解其实题解写的挺不错的,比很多比赛的题解写的详细许多了。这里站在我的角度分......
  • [题解]细胞自动机
    给定一个长度为\(n\)的\(01\)串\(s\),用于表示一个环上的细胞的初始状态,其中第\(1\)个细胞与第\(2\)个、第\(n\)个细胞相邻;第\(n\)个细胞与第\(1\)个和第\(n-1\)个相邻。\(0\)表示细胞死亡,\(1\)表示细胞存活。接下来给定\(t\)轮操作,每一轮操作,根据上一轮细胞的状态更改此轮的状态。......
  • P9668 [ICPC2022 Jinan R] Torch 题解
    思路考虑使用矩阵模拟这个过程。首先,我们可以设初值为:\[\begin{bmatrix}0&1\end{bmatrix}\]表示瘦子初始走\(0\)米,胖子初始走\(1\)米。考虑瘦子走一步。由于瘦子每走一步都不能超过胖子,我们可以使用\((\min,+)\)矩乘来维护这个性质。那么瘦子走一步是:\[\begin{bma......
  • CF292C Beautiful IP Addresses 题解(两种写法)
    题意一个IP地址是一个32位的2进制整数,分成四组8位的2进制整数(没有前导0)。比如说,0.255.1.123 是一个正确的IP地址,而0.256.1.123 和 0.255.1.01 不是正确的。定义一个合法的回文IP地址为BeautifulIPAddress(回文地址就是去掉“.”后是个回文字符串的地......
  • 沪越联赛 - 2024年6月月赛Div2 题解
    问题A:替换题目描述小明每次注释的时候都写\(n\)个/。小红看了小明的程序,觉得太难看了,那么多/,所以决定把这些没用的/都去掉。小红定义了一个宏命令,每次可以将所有连续的\(m\)个/替换成空(注意不是空格)小明得知了小红的企图后非常着急,因为他知道光把/都去掉,那么原......
  • C++题解(3) 信息学奥赛一本通: 1013:温度表达转化 洛谷:B2013 温度表达转化 土豆编程:M
    【题目描述】利用公式 C=5×(F−32)÷9C=5×(F−32)÷9(其中CC表示摄氏温度,FF表示华氏温度)进行计算转化,输入华氏温度FF,输出摄氏温度CC,要求精确到小数点后55位。【输入】输入一行,包含一个实数FF,表示华氏温度。(F≥−459.67)(F≥−459.67)【输出】输出一行,包含一个......
  • [AGC064D] Red and Blue Chips 题解
    题目链接点击打开链接题目解法挺牛的题这种计数本质不同的结果的题,一个很不错的切入口是判断结果的合法性令B的总数为\(m\)我们把结果串先挂在第\(m\)个B上考虑从后往前枚举原串(最后一个B不枚举),相当于我们在倒序模拟操作过程枚举到B,我们相当于要把后面的一个B......