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

[ARC180E] LIS and Inversion

时间:2024-08-27 09:26:39浏览次数:6  
标签:ARC180E Inversion 前缀 int leq 250010 LIS

My Blogs

[ARC180E] LIS and Inversion

首先考虑要求代价为 \(0\) 的一个暴力 DP:\(f_{i,j}\) 表示填了前 \(i\) 个数,此时相对值域末尾为 \(j\) 的数结尾的 LIS 的最大值。填第 \(i+1\) 个数的时候,把它插在某两个数之间,所以转移是:

\[f_{i,j}= \begin{cases} f_{i-1,j-1}\qquad\qquad\qquad j>i-a_{i}\\ \max_{k<j}\{f_{i-1,k}+1\}\quad 1<j\leq i-a_{i}\\ 1\qquad\qquad\qquad\qquad\;\; j=1\\ \end{cases} \]

经过观察,可以发现取前缀最大值的操作是不必要的,第二种情况可以直接令 \(f_{i,j}=f_{i-1,j-1}+1\)。

证明:假设存在 \(f_{i-1,k}>f_{i-1,j-1}\),应当用 \(k\) 贡献到 \(j\)。但是因为 \(k+1\leq j\leq i-a_i\),所以 \(k+1\leq i-a_i\),所以此时 \(f_{i,k+1}\geq f_{i-1,k}+1\)。在 \(f\) 相同的情况下,显然是下标越小的越有前途,所以 \(k+1\) 不劣于 \(j\),\(j\) 是没有用的。

这样 \(f\) 的转移就变成了:先平移一位,在最前面加入 \(0\),然后做一个 \([1,i-a_i]\) 的前缀 \(+1\) 的操作。然后可以进一步发现,如果允许代价为 \(k\),则可以看成把 \(k\) 个位置的 \(a_i\) 变成 \(0\),即前缀加变成了全局加。

所以考虑统计每个位置被多少次前缀加覆盖,这可以用差分简单实现,这样就求出来了 \(f\)。在最后位置 \(i\) 的答案上界是 \(i\),所以可以花费 \(j\) 的代价(\(j\leq i-f_i\))来获得一个 \(f_i+j\) 的答案。可以从 \(n\) 到 \(1\) 做一遍扫描线,每次令 \(t_{f_i}=f_i\),还需要查询前缀 \(\max\),可以用树状数组维护。总复杂度 \(\mathcal O(n\log n)\)。(最后这一步好像可以 \(\mathcal O(n)\) 的谔谔)

int n,a[250010],f[250010],ans[250010];
namespace BIT
{
	int t[250010];
	inline void add(int x,int y){for(;x<=n;x+=x&-x)Mmax(t[x],y);}
	inline int ask(int x){int s=0;for(;x;x-=x&-x)Mmax(s,t[x]);return s;}
}
using namespace BIT;
inline void mian()
{
	read(n);int x;
	for(int i=1;i<=n;++i)read(x),f[n-i+1]++,f[n-x+1]--;
	for(int i=1;i<=n;++i)f[i]+=f[i-1];
	for(int i=n;i>=1;--i)add(f[i],f[i]),ans[i]=i-ask(i);
	for(int i=1;i<=n;++i)write(ans[i]);
}

标签:ARC180E,Inversion,前缀,int,leq,250010,LIS
From: https://www.cnblogs.com/WrongAnswer90/p/18381998

相关文章

  • 调用ArrayList的add方法抛异常UnsupportedOperationException
    调用ArrayList的add方法抛异常UnsupportedOperationException对于一些想要把数组转成List的需求,可能会使用到Arrays.asList()获取List对象,但是这里面也存在一些问题。示例代码如下voidtest1(){List<Object>list=Arrays.asList();list.add("hello");......
  • 1047 Student List for Course【超简单思路,map,vector,对于超时问题】
    ZhejiangUniversityhas40,000studentsandprovides2,500courses.Nowgiventheregisteredcourselistofeachstudent,youaresupposedtooutputthestudentnamelistsofallthecourses.InputSpecification:Eachinputfilecontainsonetestcase.Fo......
  • 使用ArraysList集合类实现新闻管理系统
    新闻管理系统,需求如下:        可以存储各类新闻标题(包含ID、名称、创建者)。        可以获取新闻标题的总数。        可以逐条打印每条新闻标题的名称。 News类:新闻类来存储新闻的相关信息,包括ID、名称和创建者。publicclassNews{publi......
  • ArrayList遍历, 元素查找
    1,ArrayList集合的遍历与数组类似,都可以使用foreach语句string[]str1={"a","b","c","d","e","f"};ArrayListList=newArrayList(str1);foreach(variteminList)......
  • ArrayList元素的删除(4种函数)
    1Clear()方法Clear()方法用来从ArrayList中移除所有元素,语法格式如下。string[]str1={"a","b","c"};ArrayListList=newArrayList(str1);List.Clear();2Remove()方法Remove()方法用来从ArrayList中移除特定对象的第一个......
  • ArrayList声明,Add(), Insert();
     ArrayList提供了3个构造器,通过这3个构造器可以有3种声明方式。(1)默认构造器,会以默认大小(16位)初始化内部数组。构造器格式如下。ArrayListList=newArrayList();//实例化一个ArrayList,命名为List;for(inti=0;i<10;i++)//添加10个元素......
  • 重塑列表美学:CSS `list-style` 属性的魔法
    重塑列表美学:CSSlist-style属性的魔法摘要CSS的list-style属性是控制列表项标记样式的强大工具。通过这个属性,开发者可以轻松改变无序列表和有序列表的外观,包括标记的类型、位置以及图像。本文将深入探讨list-style属性的各个方面,并提供丰富的代码示例,展示如何使用......
  • P3547 [POI2013] CEN-Price List 题解
    Description给定一个\(n\)个点\(m\)条边的无向图,边权均为\(a\)。现在将原来图中满足最短路等于\(2a\)所有的点对\((x,y)\)之间加一条长度为\(b\)的无向边。给定\(k\),求点\(k\)到所有点的最短路是多少。\(1\leqn,m\leq10^5\)。Solution首先有个显然的结论是......
  • ArrayList动态扩容机制(长度可变原理)
    ArrayList底层是数组结构的,数组的默认长度为10。当数组添加满了后,会自动扩容为1.5倍。原理讲解:1.用空参构造函数创建ArrayList集合容器。测试代码:publicclassArrayListDemo{publicstaticvoidmain(String[]args){//创建ArrayList集合容器......
  • 关于Arrays.asList返回的List无法新增和删除?
    这个是在写项目的时候发现的,然后就分析了一下源码,得其内部原理复现代码示例:publicclassArraysAsList{publicstaticvoidmain(String[]args){Integer[]array={1,2,3,4,5};List<Integer>list=Arrays.asList(array);list.forEach......