• 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;
    }
    
  • 相关阅读:
    使用路由传参时,query与params的区别!
    写前端页面步骤----vue+iview
    使用vue做表单验证
    vue中find函数
    @Controller和@RestController的区别?
    JavaScript 拥有动态类型
    Console的9种用法
    Navicat连接Oracle报ORA-12737错误
    oracle查询数据库连接数相关
    oracle存储过程把查询到的值更新到别的表
  • 原文地址:https://www.cnblogs.com/YDDDD/p/11630146.html
Copyright © 2020-2023  润新知