题意:

一个序列有n个数,有一种操作,你可以选一个数x,使这个序列中等于x的数都移到序列头或尾。

问最少几次操作后,可以使这个序列非降序。

思路:

(以下说bi移动到哪里,其实就是指a1……an中等于bi的数移动到哪里)

设这个序列为a1……an,排序并去重后为b1……bm ,如果bi要移到开头,那么bi,bi-1,……,b1肯定要依次移到开头,移到尾部也是同理。

也就是说,最后就是bl……br不需要移动,而r-l越大越好,就是不需要移动的这连续的一段越长越好。

移动到头部和尾部的那些最后一定符合要求,不需要我们操心,我们只需要判断bl……br在原序列上在不移动的情况下是否符合非降序即可。

代码:

#include <stdio.h>
#include <queue>
#include <string>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <map>
#include <set>
#include <iostream>
using namespace std;
typedef long long int ll;
const int maxn = 3e5 + ;
const int inf = 0x3f3f3f3f;
const ll mod = 1e9 + ;
const ll seed = ;
int a[maxn],l[maxn],r[maxn],n,b[maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i = ;i <= n;i++){
scanf("%d",&a[i]);
if(l[a[i]] == )
l[a[i]] = i;
r[a[i]] = i;
}
sort(a + ,a + n + );
int cnt = ;
b[++cnt] = a[];
for(int i = ;i <= n;i++){
if(a[i] != a[i - ])
b[++cnt] = a[i];
}
n = cnt; int ans = ,_l = ,_r = ;
while(_r <= n){
if(r[b[_r - ]] > l[b[_r]]){
ans = max(ans,_r - - _l + );
_l = _r;
}
_r++;
}
ans = max(ans,n - _l + );
printf("%d\n",n - ans);
for(int i = ;i <= n;i++)
l[b[i]] = ;
}
return ;
}

cf 1241 D. Sequence Sorting(思维)的更多相关文章

  1. D. Sequence Sorting dp

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

  2. BZOJ1345 Baltic2007 序列问题Sequence 【思维题】*

    BZOJ1345 Baltic2007 序列问题Sequence Description 对于一个给定的序列a1,…,an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai和ai+1用 ...

  3. K.Bro Sorting(思维题)

    K.Bro Sorting Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others)T ...

  4. Codeforces Round #591 (Div. 2, based on Technocup 2020 Elimination Round 1) D. Sequence Sorting

    链接: https://codeforces.com/contest/1241/problem/D 题意: You are given a sequence a1,a2,-,an, consistin ...

  5. HDU 2062:Subset sequence(思维)

    Subset sequence Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...

  6. CF 327B. Hungry Sequence

    B. Hungry Sequence time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  7. 【CF 1059C】 Sequence Transformation 数学

    C. Sequence Transformation:http://codeforces.com/contest/1059/problem/C 题意 给你一个n,第一次输出1-n个数的gcd,然后你可 ...

  8. Codeforces Round #529 (Div. 3) E. Almost Regular Bracket Sequence(思维)

    传送门 题意: 给你一个只包含 '(' 和 ')' 的长度为 n 字符序列s: 给出一个操作:将第 i 个位置的字符反转('(' ')' 互换): 问有多少位置反转后,可以使得字符串 s 变为&quo ...

  9. Serval and Parenthesis Sequence【思维】

    Serval and Parenthesis Sequence 题目链接(点击) Serval soon said goodbye to Japari kindergarten, and began ...

随机推荐

  1. 使用U盘安装Linux最美桌面发行版Elementary OS 及常用开发环境配置(JDK,Redis,MySQL,Docker,IDEA,STS)

    前言 假期在家无聊,刚好把六年前的一台笔记本电脑利用起来,原来电脑虽然说配置说不上古董机器,但是运行win系统感觉还是不流畅,所幸给换成Linux桌面版系统,在网上查阅了很多,Linux桌面系统要么推 ...

  2. vue-i18n突然所有的都解析不出来了

    因为浏览器cookie缓存的语言标志与代码中不一致

  3. 手机连接jmeter录制脚本测试

    1.准备条件 电脑安装好jmeter,准备好一个手机 注意: 电脑和手机连接的网络要一致 手机设置代理协议前要先进入想要抓取的网站: http://39.107.96.138:3000/ 2.jmet ...

  4. Day6 - C - Count HYSBZ - 1452 /1452: [JSOI2009]Count

    Description 一个N*M的方格,初始时每个格子有一个整数权值,接下来每次有2个操作: 改变一个格子的权值 求一个子矩阵中某个特定权值出现的个数   Input 每一行有两个数字N,M 接下来 ...

  5. 向量容器vector操作

    1.向量容器vector 1.1 vector说明 进行vector操作前应添加头文件#include<vector>: vector是向量类型,可以容纳许多类型的数据,因此也被称为容器: ...

  6. 0-java概述

    目录 Java发展历史 java规范 Java三大分支 Java SE学习路径 HelloWorld 1.Java发展历史 - Java出身于sun公司 - sun公司被Oracle公司收购 2.ja ...

  7. 将xml字符串的所有叶标签转换成Map集合

    实际问题:对方服务器接口采用webservice方式返回xml报文,现需解析xml获取所有叶节点的标签名及携带的值 解决方案:利用dom4j解析xml并利用递归获取叶节点,将标签名及标签值封装到Map ...

  8. python实现二分法

    前言: 二分法主要是用来查找位置的id,每次能够排除掉一半的数据,查找的效率非常高,但是局限性比较大. 必须是有序序列才可以使用二分查找. 原理 首先,假设表中元素是按升序排列,将表中间位置记录的关键 ...

  9. Golang的基础数据类型-浮点型

    Golang的基础数据类型-浮点型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.浮点型概述 Go语言提供两种精度的浮点数,即float32和float64,其中float32 ...

  10. Idea 打开多profile注意事项

    Maven项目经常会有多个profile,可以方便在编译时指定profile. 如果有多个profile,idea 在打开工程后默认配置可能会有些问题. 例如: 最近在编译一个项目:https://g ...