首页 > 其他分享 >【dp,建模】AGC032D Rotation Sort

【dp,建模】AGC032D Rotation Sort

时间:2023-07-19 20:22:37浏览次数:42  
标签:Sort 右移 int ll 左移 file AGC032D Rotation 代价

Problem Link

有一个长为 \(n\) 的排列 \(p\),给定 \(A,B\),你每次可以做以下两种操作之一:

  • 选取 \(l,r\),将 \(p[l:r]\) 循环右移,代价为 \(A\);
  • 选取 \(l,r\),将 \(p[l:r]\) 循环左移,代价为 \(B\)。

求将 \(p\) 排序所需的最小代价。\(n\le 5000\)。


技巧:循环移位 → 插入 → 实数坐标,移动

首先感觉这个循环左移右移的操作非常奇怪,用一个新的表述:循环右移即把一个数插到左边一个位置,循环左移即把一个数插到右边一个位置。这是很容易能想到的。

接下来的操作相当厉害:考虑到每个数的相对位置并不好维护,于是改成改变绝对位置!每次就是把一个数移动到一个实数的位置即可!如果往左移就花 \(A\) 的代价,如果往右移就花 \(B\) 的代价。

现在就很好 dp 啦!定义 \(f(i,j)\) 表示考虑到数 \(i\),它放的位置是 \([j,j+1)\),最小代价。前缀和优化即可做到 \(O(n^2)\)。

点击查看代码
#include <bits/stdc++.h>
#define For(i,a,b) for(int i=a;i<=b;i++)
#define Rev(i,a,b) for(int i=a;i>=b;i--)
#define Fin(file) freopen(file,"r",stdin);
#define Fout(file) freopen(file,"w",stdout);
using namespace std;
const int N=5e3+5; typedef long long ll;
int n,A,B,a[N],p[N]; ll f[N][N],tf[N][N];
inline void ck(ll& x,ll y) { x>y&&(x=y); }
int main(){
	cin>>n>>A>>B; For(i,1,n) cin>>a[i],p[a[i]]=i;
	memset(f,60,sizeof(f)); f[0][0]=0;
	For(i,1,n){
		For(j,0,n){
			if(j) ck(f[i][j],tf[i-1][j-1]+(j==p[i]?0:j<p[i]?B:A));
			ck(f[i][j],tf[i-1][j]+(j<p[i]?B:A));
		}
		tf[i][0]=f[i][0]; For(j,1,n) tf[i][j]=min(tf[i][j-1],f[i][j]);
	}
	cout<<tf[n][n]<<'\n';
	return 0;
}


标签:Sort,右移,int,ll,左移,file,AGC032D,Rotation,代价
From: https://www.cnblogs.com/Charlie-Vinnie/p/17562371.html

相关文章

  • 题解 [ARC153B] Grid Rotations
    [ARC153B]GridRotations有思维含量的一题。我们横纵坐标分开考虑,对于每一个矩形,每次操作会使其内部元素的横坐标上下对调。纵坐标也同理,左右对调。而这种反转操作我们显然可以直接用两棵文艺平衡树维护,复杂度\(O(n\logn)\)。标程的做法更巧妙一下。我们可以把一条链收尾......
  • mongodb报错Sort exceeded memory limit of 104857600 bytes
    mongodb运行过程中,遇到错误信息:2023-07-14T09:29:33.853ERRFailedtoQueryBsPoolUnivStaterror="(QueryExceededMemoryLimitNoDiskUseAllowed)Executorerrorduringfindcommand::causedby::Sortexceededmemorylimitof104857600bytes,butdidnotoptinto......
  • Sort
    该和排序算法做个了结了15种排序算法动态演示这个视频是在网上看到的。那我们就跟着视频来写出这15种排序算法吧。这15种排序分别是:1.简单选择排序2.插入排序3.快速排序4.合并排序5.堆排序6.基数排序7.最高有效位排序8.内省排序9.适应性归并排序10.希尔排序(缩小增量......
  • vue2 + elementUI + sortablejs 实现可行拖拽排序表格
    需要实现表格(可以新增行,表格中直接编辑数据,行可上下拖动重新排序)实现效果(整行上下拖动之后,序号变化为1,2,3.......,可根据名称看效果哦):初始表格: 拖拽后:1.安装拖拽插件npminstallsortablejs--save页面中引入importSortablefrom'sortablejs'2.页面el-table......
  • apt-sortpkgs
    apt-sortpkgsDebianLinux下对软件包索引文件进行排序的工具补充说明apt-sortpkgs命令是DebianLinux下对软件包索引文件进行排序的简单工具。语法apt-sortpkgs(选项)(参数)选项-s:使用源索引字段排序;-h:显示帮助信息。参数文件:指定要排序的包含debian包信息的索引文件......
  • 【计数,DP】CF1081G Mergesort Strikes Back
    ProblemLink现有一归并排序算法,但是算法很天才,设了个递归深度上限,如果递归深度到达\(k\)则立即返回。其它部分都和正常归并排序一样,递归中点是\(\lfloor(l+r)/2\rfloor\),归并每次取两边较小者加入结果。给定\(n,k\),求用这个算法对一个均匀随机的排列\(p\)排序后,\(p\)......
  • CF1601F Two Sorts 题解--zhengjun
    link这里提供一种不用meetinmiddle的方法,速度比较可观。发现性质开始简单的推一下式子。\(\sum(i-a_i)\bmodp=\sum(rk_i-i-p\times\lfloor\frac{rk_i-i}{p}\rfloor)=-p\times\sum\lfloor\frac{rk_i-i}{p}\rfloor,p=998244353\)于是,只需求出\(\sum\lfloor\frac{rk_i-......
  • MySQL--Sorted Index Builds 导致备份失败故障分析
    问题概述xtrabackup备份失败,日志中有这样的信息InnoDB:Anoptimized(withoutredologging)DDLoperationhasbeenperformed.Allmodifiedpagesmaynothavebeenflushedtothediskyet.问题原因redologs会跳过一些DDL,PerconaXtraBackup监测到redolog有跳过时,它会......
  • 排序 sorted
    l=sorted([36,5,-12,9,-21])print(l)'''[-21,-12,5,9,36]'''l=sorted([36,5,-12,9,-21],key=abs)print(l)'''[5,9,-12,-21,36]''' #按照元祖里的key的name首字母lis=[('Bob',......
  • 列表list的sort方法的坑
    说明列表sort方法是原地排序即会修改原列表。在日常工作中遇到一些坑,总结在示例里 示例1'''2sort是原地排序即会修改原列表3'''45#1.原地排序,没有新增列表,只是修改了原列表。如果遇到保留原始列表,可通过切片生成1个新的6my_list=[3,1,2,5,4]7so......