luogu P3411 序列变换

链接 P3411 序列变换
  • 如果要最小化答案,那么就最大化不移动的数。
  • 那么不移动的子序列一定是最后答案的一段连续区间,而移动的数我们是一定有办法把他们还原的。
  • \(f_{i}\)表示\(i\)点的最长长度,转移实际上是恒定的,即\(f_{i}=f_{j}+1\),其中\(j\)\(i\)的前驱且唯一确定。
  • \(a\)数组离散化后直接查值域即可,复杂度\(O(nlogn)\)
#include<bits/stdc++.h>
#define R register int 
using namespace std;
const int N=1000001;
int n,Mx,ans,len,O[N],vis[N],f[N],w[N],T[N];
int gi(){
    R x=0,k=1;char c=getchar();
    while(c!='-'&&(c<'0'||c>'9'))c=getchar();
    if(c=='-')k=-1,c=getchar();
    while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-'0',c=getchar();
    return x*k;
}
int main(){
    n=gi();
    for(R i=1;i<=n;++i)w[i]=gi(),O[i]=w[i];
    sort(O+1,O+n+1),len=unique(O+1,O+n+1)-O-1;
    for(R i=1;i<=n;++i){
        w[i]=lower_bound(O+1,O+len+1,w[i])-O;
        if(!vis[w[i]])f[i]=T[w[i]-1]+1;
        else f[i]=T[w[i]]+1;
        vis[w[i]]=1,T[w[i]]=f[i],ans=max(ans,f[i]);
    }
    cout<<n-ans<<endl;
    return 0;
}

转载于:https://www.cnblogs.com/Tyher/p/9898565.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值