题目描述

alt

输入描述

alt

输出描述

alt

示例一

//输入
6
3
1 2 1
5
1 2 2 1 2
11
2 2 1 2 2 1 1 2 2 1 2
1
1
5
1 2 3 4 5
10
4 1 5 5 2 2 5 2 4 2

//输出
2
2
6
1
1
2

思路

抓住题目中col的特点,col有n种颜色,每次删除时,我们从后往前找,找的是整个剩余的数字串中,最晚出现的那个数字,然后删除该数字及该数字后面的所有数字。然后剩余数字串中的数字的种类由cnt进行记录。

代码

#include<bits/stdc++.h>
using namespace std;
int t,n;
int a[200010],vis[200010];
map<int,int>m;

void calc()
{
    scanf("%d",&n);
    int cnt =0,cnt1=0,cnt2=0,ans=0;
    for(int i =1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        if(!vis[a[i]])cnt++;
        vis[a[i]]++;//记录每个数字出现的次数
    }
    for(int i =n;i>=1;i--)
    {
        m[a[i]]++;vis[a[i]]--;
        if(m[a[i]]==1)cnt1++;
        if(vis[a[i]]==0)cnt2++;//当vis[a[i]]==0时表示该位置是该数字最后一次出现的位置,下一次删除时,没有该数字了,用cnt2记录
        if(cnt1==cnt)
        {
            ans++;
            cnt-=cnt2;
            m.clear();
            cnt1=0;
            cnt2=0;
        }
    }
    printf("%d\n",ans);
    
}
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        calc();
    }
    return 0;
}