题意

给定数组a[n],用两种操作:

1.将数组中所有值为x的数移至开头

2.将数组中所有值为x的数移至末尾

问,经过最少多少次操作,能将数组a[n]变为非递减的有序数列?

(1<=n<=3e5,1<=a[i]<=n)

思路:

如果一个数全部分布在一段连续的区间上,那么可以不移动这个数。如果有好几个这样的连续的连续区间,且它们都是非递减的,那么这一个大区间内的数都可以不移动。因此只要求出最大的(所含数种类最多的)大区间,就能得到答案(只移动剩余的数)。

将所有数离散化之后,记录每个数的最大下标和最小下标,之后实际上是一个最长上升子序列问题。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=3e5+5;
  4. int a[maxn],lisan[maxn];
  5. int dp[maxn],max1[maxn],min1[maxn];
  6. int main(){
  7. int q,n;
  8. cin>>q;
  9. while(q--){
  10. scanf("%d",&n);
  11. for(int i=1;i<=n;i++){
  12. scanf("%d",&a[i]);
  13. lisan[i]=a[i];
  14. }
  15. sort(lisan+1,lisan+1+n);
  16. int len=unique(lisan+1,lisan+1+n)-(lisan+1);
  17. for(int i=1;i<=n;i++) a[i]=lower_bound(lisan+1,lisan+len+1,a[i])-lisan;
  18. for(int i=1;i<=n;i++){
  19. max1[a[i]]=i;
  20. }
  21. for(int i=n;i>=1;i--){
  22. min1[a[i]]=i;
  23. }
  24. int res=1;
  25. for(int i=1;i<=len;i++)
  26. dp[i]=1;
  27. for(int i=2;i<=len;i++){
  28. if(min1[i]>max1[i-1]){
  29. dp[i]=dp[i-1]+1;
  30. }
  31. res=max(res,dp[i]);
  32. }
  33. int ans=len-res;
  34. printf("%d\n",ans);
  35. }
  36. }

CF1241 D Sequence Sorting(离散化+DP)的更多相关文章

  1. D. Sequence Sorting dp

    D. Sequence Sorting 题目大意:给你一个序列,有一种操作就是对所有相同的数可以挪到最前面,也可以挪到最后面,问最少操作次数. 首先,对于很多个相同的数,可以缩成两个位置,一个是就是这 ...

  2. LightOJ 1085(树状数组+离散化+DP,线段树)

    All Possible Increasing Subsequences Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format: ...

  3. poj 3666 Making the Grade(离散化+dp)

    Description A straight dirt road connects two fields on FJ's farm, but it changes elevation more tha ...

  4. Codeforces 777E(离散化+dp+树状数组或线段树维护最大值)

    E. Hanoi Factory time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  5. 项目安排(离散化+DP)

    题目来源:网易有道2013年校园招聘面试二面试题 题目描述: 小明每天都在开源社区上做项目,假设每天他都有很多项目可以选,其中每个项目都有一个开始时间和截止时间,假设做完每个项目后,拿到报酬都是不同的 ...

  6. POJ 题目1141 Brackets Sequence(区间DP记录路径)

    Brackets Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 27793   Accepted: 788 ...

  7. HDU 1141---Brackets Sequence(区间DP)

    题目链接 http://poj.org/problem?id=1141 Description Let us define a regular brackets sequence in the fol ...

  8. HDU 2836 (离散化DP+区间优化)

    Reference:http://www.cnblogs.com/wuyiqi/archive/2012/03/28/2420916.html 题目链接: http://acm.hdu.edu.cn/ ...

  9. hdu 4833 离散化+dp ****

    先离散化,然后逆着dp,求出每个点能取到的最大利益,然后看有没有钱,有钱就投 想法好复杂 #include <stdio.h> #include <string.h> #inc ...

随机推荐

  1. k8s 组件介绍-kube-schedule

    kubernetes scheduler 基本原理 kubernetes scheduler 作为一个单独的进程部署在 master 节点上,它会 watch kube-apiserver 进程去发现 ...

  2. 2019牛客暑期多校训练营(第一场) - B - Integration - 数学

    https://ac.nowcoder.com/acm/contest/881/B https://www.cnblogs.com/zaq19970105/p/11210030.html 试图改写多项 ...

  3. qt 如何注册自定义类型?

    如何声明自定义类型 如果仅仅在 QVariant 中使用,则仅需要使用 Q_DECLARE_METATYPE 宏进行声明即可. class Custom_ : public QObject { Q_O ...

  4. linux误用rm删除文件后恢复

    linux 系统:ubuntu16.04 误把/usr/local local文件删除了,要疯 步骤: 1.对于文件系统为ext3文件系统 sudo apt-get install ext3grep ...

  5. RestController和Controller的区别

    知识点:@RestController注解相当于@ResponseBody + @Controller合在一起的作用. 1) 如果只是使用@RestController注解Controller,则Co ...

  6. vue.js(8)--v-for的使用

    v-for遍历数组.对象数组.对象.迭代次数 <!DOCTYPE html> <html lang="en"> <head> <meta ...

  7. JS 页面繁简字转换

    // 本js用于客户在网站页面选择繁体中文或简体中文显示,默认是正常显示,即简繁体同时显示// 在用户第一次访问网页时,会自动检测客户端语言进行操作并提示.此功能可关闭// 本程序只在UTF8编码下测 ...

  8. Vue-cli3 环境的搭建

    Vue-cli3 环境的搭建 准备 浏览器插件:Vue.js devtools VsCode 和 VsCode 插件 WebStorm Nodejs vue-cli git 起飞 安装vue-cli3 ...

  9. Sass-注释

    注释对于一名程序员来说,是极其重要,良好的注释能帮助自己或者别人阅读源码.在 Sass 中注释有两种方式,我暂且将其命名为: 1.类似 CSS 的注释方式,使用 ”/* ”开头,结属使用 ”*/ ”2 ...

  10. Vue--按键修饰符(逐个学习按键修饰符)

    在监听键盘事件时,我们经常需要检查常见的键值.Vue 允许为 v-on 在监听键盘事件时添加按键修饰符: <!-- 只有在 `keyCode` 是 13 时调用 `vm.submit()` -- ...