题目2
题意:
给定n个元素,存在重复。每次操作可以把一种元素放到数组的最前面或最后面。要求输出最少的操作次数使得数组有序。
分析:
考虑那些没有被操作的元素,那么他们必然是连续的一段相互不相交且元素紧挨着增大的的序列(紧挨着增大意思是无法找到别的元素可以插在中间)。所以我们只需要排序去重来找最长满足这一条件的即可。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
int l[300005],r[300005];
vector<int> num;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin >> t;
while( t-- )
{
num.clear();
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
int x;
cin >> x;
num.push_back(x);
if( l[x] == 0 ) l[x] = i;
r[x] = i;
}
sort(num.begin(),num.end());
int m = unique(num.begin(),num.end()) - num.begin();
int ri = 0;
int sum = 0;
int ans = 0;
for (int i = 0; i < m; i++)
{
if( l[num[i]] > ri ) sum ++;
else sum = 1;
ri = r[num[i]];
ans = max(ans,sum);
}
cout << m - ans << '\n';
for (int i = 1; i <= n; i++)
{
l[i] = 0;
r[i] = 0;
}
}
return 0;
}