首页 > 其他分享 >[AGC062B] Split and Insert 题解

[AGC062B] Split and Insert 题解

时间:2024-02-10 20:44:39浏览次数:25  
标签:Insert ch int 题解 long 序列 Split 升序 define

题目链接

点击打开链接

题目解法

咋神仙区间 \(dp\) 题永远想不到区间 \(dp\)???

首先把操作顺序反转
那么现在的问题就是:每次可以选出一个子序列放到序列末尾,使序列升序的最小代价

这个问题看着也是毫无头绪
我尝试去找些规律,当然也没找到
考虑精细刻画操作过程:最终的序列是升序的,最后一次操作是找到两个升序子序列 \([1,x]\) 和 \([x+1,n]\)(值域上),然后继续去划分 \([1,x]\),\([x+1,n]\) 到更小的值域范围
可能唯一能想到的入手点就是从这个过程出发,从而得到区间 \(dp\)

令 \(f_{i,l,r}\) 为操作了 \(i\) 次,把 \([l,r]\) 排好序的最小代价
转移不难得到为:
\(f_{i,l,r}\to f_{i+1,l,r}\)
\(f_{i,l,q}+f_{i,q+1,r}+c_{k-i+1}\times (r-q)\to f_{i+1,l,r}\)(注意操作是逆序的,所以乘的是 \(c_{k-i+1}\))

时间复杂度 \(O(n^3k)\)

#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);}
inline int read(){
    int FF=0,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;
    return FF*RR;
}
const int N=110;
int n,k,c[N],p[N],rv[N];
LL f[N][N][N];
int main(){
    n=read(),k=read();
    F(i,1,k) c[i]=read();
    F(i,1,n) p[i]=read(),rv[p[i]]=i;
    ms(f,0x3f);
    F(i,1,n){
        f[0][i][i]=0;
        int la=rv[i];
        F(j,i+1,n){
            if(rv[j]<la) break;
            f[0][i][j]=0,la=rv[j];
        }
    }
    F(i,1,k)
        F(len,1,n) F(l,1,n-len+1){
            int r=l+len-1;
            f[i][l][r]=f[i-1][l][r];
            F(q,l,r-1) chkmin(f[i][l][r],f[i-1][l][q]+f[i-1][q+1][r]+1ll*c[k-i+1]*(r-q));
        }
    if(f[k][1][n]>1e18) puts("-1");
    else printf("%lld\n",f[k][1][n]);
    return 0;
}

标签:Insert,ch,int,题解,long,序列,Split,升序,define
From: https://www.cnblogs.com/Farmer-djx/p/18013036

相关文章

  • P8670 [蓝桥杯 2018 国 B] 矩阵求和 题解
    题目传送门前置知识欧拉函数解法欧拉反演,简单地推下式子即可。\(\begin{aligned}\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\gcd(i,j)^{2}&=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\sum\limits_{d=1}^{n}d^{2}[\gcd(i,j)=d]\\&=\sum\limits_{i=1}^{n}\sum......
  • Ucup2 -19题解
    Ucup2-19题解:​ 这场的题还是挺有意思的,之前回家后因为过年的准备+美赛摆了挺久没训练,现在开始复健,顺便复活一下死去已久的博客。​ 水题就不赘述了,这次主要说说几道比较难的但思路很有趣的题目,顺序就按难度排吧。G.LCACountingProblem-G-Codeforces题意:给定一颗无向......
  • AtCoder ABC 263 D 题解
    AtCoderABC263D题解前言本蒟蒻的第一篇题解,大佬勿喷QwQ传送门们洛谷传送门AtCoder传送门正文设有\(x\)使得\(x\leqk\)时,令\(f(k)\)为对\(A'\)进行运算后\(A'=(A_1,A_2,\ldots,A_k)\)的最小和。同理,对于\(y\)使得\(y\leqk\)时,令\(g(k)\)为对\(A......
  • 新年欢乐赛题解
    cyh巨佬举办的比赛。比赛页面赛后补题官方题解赛时没时间写题,赛后补一下。T1:默认排名第一,对于每次输入,若输入的成绩更优,则将排名降低。这里更劣的成绩没用,因为默认初始排名第一。T2:At上的一道原题。考虑DP求解。\(dp_{i,0/1}\)分别表示到第\(i\)张翻和不翻的总......
  • P9170 [省选联考 2023] 填数游戏 题解
    Description众所周知,Alice和Bob是一对好朋友。今天,他们约好一起玩游戏。一开始,他们各自有一张空白的纸条。接下来,他们会在纸条上依次写\(n\)个\([1,m]\)范围内的正整数。等Alice写完,Bob在看到Alice写的纸条之后开始写他的纸条。Alice需要保证她写下的第\(i\)个......
  • P9478 [NOI2023] 方格染色题解
    题解对于行操作,列操作和对角线操作,实际上仅仅只是在对若干个矩形求面积并而已,这是裸的扫描线题,套用模板即可,此时注意到对角线操作实际上是\(O(n)\)量级的矩阵面积并,因此复杂度是\(O(n\logq+q\logq)\)的量级,只能获得95pts。显然,面积并具有交换性,我们先做\(O(q\logq)\)......
  • uoj839 龙门题字 题解
    题目链接点击打开链接题目解法呜呜呜,我考场上只会\(60\),不会优化,没救了要求字典序最大,不难想到一位一位钦定,那么我们现在的问题是判断\(ans_1,...,ans_i\)是否合法,记\(ok_{i,j}\)表示第\(i\)个修改在第\(j\)位是否可行(即\(x_{i,j}\geans_j\)),同时记\(cnt_i\)为第......
  • 2024大试牛刀5题解
    鼠鼠我鸭没学过前缀和的自己去补一下,这里不过多赘述(其实是我不想写)以第二组数据为例:类型0100体重2565先计算出不使用魔法时鸭鸭的重量,当作基础值\(ori=5\)。然后来看看对一段区间使用魔法会造成什么效果:类型0100体重2565变化a+2-5......
  • ABC338G题解
    也许是一个简单一点的做法?假如我们要求一个表达式的值,我们求的顺序显然是,按照加号划分为若干段,段内只有数字和乘号,计算出段内结果后全部加起来。称一个只有数字和乘号的表达式是基本表达式,我们将每个表达式的贡献拆分为若干个基本表达式之和,那么我们就可以枚举每个基本表达式,算......
  • CF516D Drazil and Morning Exercise 题解
    Description给定一棵\(n\)个点的树,边有边权。定义\(f_x=\max_{i=1}^n\text{dist}(x,i)\)。\(q\)次询问最大的满足\(\max_{x\ins}f_x-\min_{x\ins}f_x\lel\)的连通块\(s\)包含的点数。\(n\le10^5\),\(q\le50\)。Solution这里\(f_u\)显然可以用换......