首页 > 其他分享 >ARC180E LIS and Inversion

ARC180E LIS and Inversion

时间:2024-07-04 22:10:13浏览次数:14  
标签:ARC180E Inversion 10 int 个数 leq LIS 代价 转移

题目大意

一个排列\(p\)分数为\(p\)的最长上升子序列的长度,代价为满足\(\sum_{j=1}^{i-1}[p_j>p_i]<a_{i}\)的\(i\)的数量
给定\(\{a_n\}\),对于\(\forall k\in[1,n]\),求分数大于等于\(k\)的排列的代价的最小值

\[n\leq 250000,1\leq a_i<i \]

题解

玄妙优化\(dp\)题
我们可以考虑求出代价为\(k\)的排列分数的最大值,这个反过来就可以得到题目所求
考虑代价为\(0\)的排列分数的最大值,设\(f_{i,j}\)表示考虑了前\(i\)个数,从小到大排名为\(j\)的数为结尾的最长上升子序列长度
第一种转移,第\(i\)个数为第\(k\)名,原来\([1,k-1]\)名的数排名不动,\(k\)最大取\(i-a_i\)

\[f_{i-1,j}\rightarrow f_{i,j}(j<i-a_i) \]

第二种转移,第\(i\)个数为第\(k\)名,原来\([k,i-1]\)名的数排名上升一位

\[f_{i-1,j-1}\rightarrow f_{i,j} \]

第三种转移,第\(i\)个数为第\(j\)名,可以从排名小于\(j\)的数转移过来

\[\max_{k=1}^{j-1}f_{i-1,k}+1\rightarrow f_{i,j}(j\leq i-a_i) \]

仔细思考,发现第一种转移是不必要的,因为不如直接让第\(i\)个数为第\(j\)名,从排名小于\(j\)的数转移,这样肯定是不劣的,第三种转移也可以优化,对于一个\(k\),转移到\(j>k+1\)是不优的
于是转移变成,\(f_{i,j}=f_{i-1,j-1}+[j\leq i-a_i]\)
\(f_{n,j}=\sum_{i=1}^j[j-i+1\geq n-i+1-a_{n-i+1}]=\sum_{i=1}^j[j\leq n-a_{n-i+1}]\)
一个\(a_i\)对\(f\)的影响是一段区间,可以用差分算出,\(\max_{j=1}^nf_{n,j}\),即为代价为\(0\)时的分数最大值
接下来考虑代价,假设让\(i\)位产生代价\(1\),可以理解将\(dp\)转移时的\(f_{i,j}=f_{i-1,j-1}+[j\leq i-a_i]\)变为\(f_{i,j}=f_{i-1,j-1}+1\),对最终\(f\)的影响是使得\(j\in[n-a_i+1,n],f_{n,j}\)加\(1\),那么可以贪心的按\(a_i\)从大到小开始产生代价,\(a_i\)的排序可以用桶排实现
时间复杂度为\(O(n)\)

\(\text{code}\)

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=3e5+1000;
int n,a[N+10],f[N+10],g[N+10],h[N+10];
int main()
{
//	freopen("ARC180E.in","r",stdin);
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]),g[n-a[i]+1]++;
	for(int i=1;i<=n;i++) f[n-i+1]++,f[n-a[i]+1]--;
	for(int i=1;i<=n;i++) f[i]+=f[i-1];
	for(int i=n;i>=1;i--) f[i]=max(f[i],f[i+1]);
	for(int i=1;i<=n+1;i++) h[i]=n;
	h[f[1]]=0;
	int res=0;
	for(int i=1;i<=n;i++)
	{
		h[f[i]+res]=min(h[f[i]+res],res);
		while(g[i])
		{
			res++,g[i]--;
			h[f[i]+res]=min(h[f[i]+res],res);
		}
	}
	for(int i=n;i>=1;i--) h[i]=min(h[i],h[i+1]);
	for(int i=1;i<=n;i++) printf("%d ",h[i]);
	return 0;
}

标签:ARC180E,Inversion,10,int,个数,leq,LIS,代价,转移
From: https://www.cnblogs.com/the-blog-of-doctorZ/p/18284776

相关文章

  • list、set、map的区别
    1.元素的重复性:1.1list可以存放重复的元素1.2set的add方法可以存放重复的元素,但最终set中存放的元素是不重复的。1.3map是以键值对的方式存储的,key不能重复,值可以重复。2.元素是否为null2.1list可以存放多个null2.2set中add方法可以存放多个null,但最终set中只有一个nul......
  • Delphi 常用控件之TlistView总结
    TlistView组件功能:(1)TListView控件可以用来显示各项带图标的列表,包括大图标和小图标的;也可以用来显示带有子项的列表,Windows操作系统的资源管理器中文件夹窗口就是最好的应用例子,就是我们打开"我的电脑"后能够看到各个盘符的界面(2)TListView控件基本能实现和DBGrid控件一......
  • torch.tensor、numpy.array、list三者之间互相转换
    torch.tensor、numpy.array、list三者之间互相转换1.1list转numpyndarray=np.array(list)1.2numpy转listlist=ndarray.tolist()2.1list转torch.Tensortensor=torch.Tensor(list)2.2torch.Tensor转list先转numpy,后转listlist=tensor.numpy().tolist(......
  • 分别使用CMAKE和CLION编译,同一个cmakelists.txt, 为什么clion出错和cmake正常?clion出
    求助!!我在github上找到了一个大型的应用软件的开源代码,使用CMAKE编译,再用VS2017以生成应用程序。因为想改代码,所以使用了CLion在本地运行。但是cmake能够正常通过的文件代码,clion却出错。用的同一个cmakelists.txt,请问为什么clion出错和cmake正常呢?求求~改动了很久cmakelist......
  • 使用Redis实现消息队列:List、Pub/Sub和Stream的实践
    摘要Redis是一个高性能的键值存储系统,它的多种数据结构使其成为实现消息队列的理想选择。本文将探讨如何使用Redis的List、Pub/Sub和Stream数据结构来实现一个高效的消息队列系统。1.消息队列的基本概念消息队列是一种应用程序之间进行通信的机制,允许应用程序以异步的......
  • Go标准库:container/list
    Go标准库:container/list原创 孟斯特 孟斯特 2024-07-0316:03 北京 听全文在Go语言的标准库中,container/list包提供了一个双向链表的实现,这对于需要频繁插入和删除操作的场景非常有用。双向链表是一种线性数据结构,它由一系列节点组成,每个节点包含数据和两个指针,分别......
  • unity 从list中获取最近的坐标 / 获取最接近的角度(数值)
    ///<summary>///从列表points中获取距离targetPoint最近的坐标///</summary>///<paramname="points"></param>///<paramname="targetPoint"></param>///<returns><......
  • lombard waitlist
    fromcurl_cffiimportrequestsfrompprintimportpprintimporttimedefsend_mail(mail):pprint(mail)headers={'accept':'*/*','accept-language':'zh-CN,zh;q=0.9','cache-c......
  • [IOT2050 question] Unable to listen on http://127.0.0.1:1880/ 端口被占用错误
    1.背景第一次连接node-red的时候,一直出现错误Unabletolistenonhttp://127.0.0.1:1880/。如下:2.原因分析估计是早前利用iot2050setup小工具把node-red设置为开机自动启动项了,导致1880端口一直被占用。3.验证首先查看端口是否真的被占用,利用sudonetstat-ltup命......
  • ACCOMPLISH vs COMPLETE coca 搭配
       WORD 1: ACCOMPLISH  WORDW1W2  FEATS692  FEAT44320  GOALS1113113  DEEDS334  PURPOSES11916  THINGS1204163  OBJECTIVES28742  LOT37859  ANYTHING934155  SOMETHING1053211......