首页 > 其他分享 >[AGC032D] Rotation Sort 题解

[AGC032D] Rotation Sort 题解

时间:2023-12-05 17:47:50浏览次数:37  
标签:Sort ch 题解 void long template AGC032D getchar define

题目链接

点击打开链接

题目解法

题目中的操作可以理解为一个点移动位置
首先给出一个结论:每个点只会动至多一次
考虑 \(dp\)
一个比较妙的状态设定是 \(f_i\) 表示 \(i\) 不动的方案数
不妨枚举 \(j\) 表示上一个不动点,限制是 \(j<i\) 且 \(p_j<p_i\)
中间满足 \(j<k<i\) 且 \(p_k>p_i\) 的都要移到 \(i\) 后面,代价为 \(A\)
中间满足 \(j<k<i\) 且 \(p_k<p_j\) 的都要移到 \(j\) 前面,代价为 \(B\)
中间其他的点需要动,且需要排成一个顺序,一个显然的结论是,每个点都只往左边或右边动可以得到任意一个顺序,所以代价为 \(\min(A,B)\)

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

#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 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=5100;
int n,A,B,a[N],s[N][N];
LL f[N];
int main(){
    read(n),read(A),read(B);
    F(i,1,n) read(a[i]);
    F(i,1,n) F(j,1,n)
        if(a[j]<a[i]) s[i][j]=s[i][j-1]+1;
        else s[i][j]=s[i][j-1];
    memset(f,0x3f,sizeof(f));
    f[0]=0,a[n+1]=1e9;
    F(i,1,n+1){
        int rs1=0;
        DF(j,i-1,0){
            if(a[j]<a[i]){
                int rs2=s[j][i-1]-s[j][j];
                chkmin(f[i],f[j]+1ll*rs2*B+1ll*rs1*A+1ll*(i-j-1-rs1-rs2)*min(A,B));
            }
            rs1+=a[j]>a[i];
        }
    }
    printf("%lld\n",f[n+1]);
    return 0;
}

标签:Sort,ch,题解,void,long,template,AGC032D,getchar,define
From: https://www.cnblogs.com/Farmer-djx/p/17877768.html

相关文章

  • [AGC037D] Sorting a Grid 题解
    题目链接点击打开链接题目解法从后往前推一下,可以得到\(C\)一定要把每一行的数都归位到那一行,\(B\)一定要每一列的目标行数互不相同考虑构造\(B\)这个限制看起来略有些网络流,所以考虑如何建图令\(a_{i,j}\)的目标行数为\(ln_{i,j}\),我们由\(i\toln_{i,j}\)连边不......
  • binarySortTree
    二叉排序树二叉排序树BST(BinarySot(Search)Tree):对于二又排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。算法描述:第一种情况:删除叶子节点(比如:2,5,9,12)思路:(1)需求先去找到要删除的结点targetNode(2)找到targetNode......
  • [ABC254E] Small d and k 题解
    题目传送门一道暴力题。度数和\(k\)那么小?直接暴力\(n\)遍bfs,注意bfs的队列只能push距离不超过\(3\)的点。但有个问题,每次bfs都需要清空一次距离数组,这样子的时间复杂度是\(O(n^2)\)的。但也不难想到,距离数组中被赋值的地方不会很多,记录一下就行。Code#include......
  • RestTemplate 请求 webservice 中文乱码问题解决【问题解决】
    添加一个Converter设置UTF-8编码@ConfigurationpublicclassRestTemplateConfig{@BeanpublicRestTemplaterestTemplate(){RestTemplaterestTemplate=newRestTemplate();//添加自定义的ClientHttpRequestInterceptor全局JSON請......
  • [ARC141D] Non-divisible Set 题解
    题目链接点击打开链接题目解法很思维的题,需要用好所有的特殊性质暴力的做法是建出图,然后求包含点\(i\)的最长反链,但这明显过不了上面的做法没用到\(a_i<2m\)的性质如何用?把\(a_i\)拆分成\(q\times2^k\;(k\)为奇数\()\)的形式,那么对于同一个\(q\),只能在其中选一个......
  • [ARC141E] Sliding Edge on Torus 题解
    题目链接点击打开链接题目解法比较套路的题首先画个图,然后把\(y-x\)相同的变成一个点(使\(y>x\))然后再两个点之间连有权边那么问题就变成求新图的每个连通块中形成的原图的连通块数量手玩几个数据发现,原图的连通块数量即为新图的所有环长的\(\gcd\),再和\(n\)的\(\gcd......
  • [AGC061C] First Come First Serve 题解
    题目链接点击打开链接题目解法易知总情况数为\(2^n\)考虑重复计算的情况为:存在\([l_i,r_i]\),满足没有\([l_j,r_j](i\neqj)\)选在此区间中可以得到一个容斥的\(dp\)做法这个转移虽然感觉很显然,但卡了我一个晚上,一直调不出令\(f_i\)为到\(i\)的容斥情况下的权值和......
  • [CF1902] Educational Codeforces Round 159 A~E 题解
    [CF1902]EducationalCodeforcesRound159A~E题解A.BinaryImbalance很快观察到如果有不同的相邻元素,那么一定有解,意味着如果全是1无解,其他有解B.GettingPoints题面很长,可以发现,最好的偷懒方式一定是把所有的课都拖到最后几天上(真实),可以简单调整证明这样是不劣的,最后......
  • CF1833G Ksyusha and Chinchilla 题解
    题意:思路:当$n\not\equiv0\space(mod\space3)$时,无解;当$n\equiv0\space(mod\space3)$时,设$size_u$表示以$u$为根的子树还剩余的节点个数,自根节点向叶子节点递归,返回时进行处理节点$u$:设节点$u$的子节点为长度为$len$的序列$v$,设......
  • [ARC120E] 1D Party 题解
    提供二分+DP做法。Solution题意给出\(n(\le2\times10^5)\)个单调递增偶整数\(a_i\),求最小的\(k\)满足每一个\(i\)都可以在\(k\)时刻之前(含)与相邻的数相遇。每个单位时间可以移动一个单位距离。思路启发式思考在想到正解之前,我们可以想想类正解。显然,在时间一单......