zoukankan      html  css  js  c++  java
  • 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, consisting of integers.

    You can apply the following operation to this sequence: choose some integer x and move all elements equal to x either to the beginning, or to the end of a. Note that you have to move all these elements in one direction in one operation.

    For example, if a=[2,1,3,1,1,3,2], you can get the following sequences in one operation (for convenience, denote elements equal to x as x-elements):

    [1,1,1,2,3,3,2] if you move all 1-elements to the beginning;
    [2,3,3,2,1,1,1] if you move all 1-elements to the end;
    [2,2,1,3,1,1,3] if you move all 2-elements to the beginning;
    [1,3,1,1,3,2,2] if you move all 2-elements to the end;
    [3,3,2,1,1,1,2] if you move all 3-elements to the beginning;
    [2,1,1,1,2,3,3] if you move all 3-elements to the end;
    You have to determine the minimum number of such operations so that the sequence a becomes sorted in non-descending order. Non-descending order means that for all i from 2 to n, the condition ai−1≤ai is satisfied.

    Note that you have to answer q independent queries.

    思路:

    记录每个值的左端点和右端点,
    然后找出满足范围不相交的最长的连续值.
    比赛想了半天硬是没想到能记录两个点..

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    const int MAXN = 3e5+10;
    
    set<int> St;
    int l[MAXN], r[MAXN];
    int n;
    
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int t;
        cin >> t;
        while(t--)
        {
            St.clear();
            int v;
            cin >> n;
            for (int i = 1;i <= n;i++)
                l[i] = n, r[i] = 1;
            for (int i = 1;i <= n;i++)
            {
                cin >> v;
                l[v] = min(i, l[v]);
                r[v] = max(i, r[v]);
                St.insert(v);
            }
            int cnt = 0, rp = -1, ans = 0;
            for (auto x: St)
            {
                if (l[x] > rp)
                    cnt++;
                else
                    cnt = 1;
                rp = r[x];
                ans = max(cnt, ans);
            }
            cout << St.size()-ans << endl;
        }
    
        return 0;
    }
    
  • 相关阅读:
    Java 8新特性探究(九)跟OOM:Permgen说再见吧
    Java 堆内存(Heap)[转]
    hashmap源码
    Java8学习笔记----Lambda表达式 (转)
    双重检查锁定与延迟初始化(转自infoq)
    kvm的live-snapshot
    8.25考试总结
    CF1151FSonya and Informatics
    CF1151div2(Round 553)
    BZOJ3728 PA2014Final Zarowki
  • 原文地址:https://www.cnblogs.com/YDDDD/p/11630146.html
Copyright © 2011-2022 走看看