CF1234B2题解

· · 题解

题解思路:

deque 来维护序列,然后,用一个 map 来看是否添加过了。

具体分为一下步骤:

若当前已经有了,那么直接 continue

若长度 = k 了,就弹出队尾,然后把标记删掉。

然后插入队头,然后再标记一下就可以了。

AC CODE:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <deque>
#include <map>
using namespace std;
int n , k;
int a[200010];
deque <int> q;//维护序列
map <int , int> ma;//在聊天框里是否出现过
int main(){
    scanf ("%d%d" , &n , &k);
    for (int i = 1; i <= n; ++ i)
        scanf ("%d" , &a[i]);
    for (int i = 1; i <= n; ++ i) {
        if (ma[a[i]]) continue;//已经出现过了,那么就跳过
        if (q.size () == k) ma[q.back()] = false , q.pop_back();//弹出,然后去掉标记
        if (!ma[a[i]])q.push_front (a[i]) , ma[a[i]] = true;//插入,标记
    }
    cout << q.size() << endl;//输出长度
    for (int i = 0; i < q.size(); ++ i)
        cout << q[i] << ' ';//输出聊天窗里的数
    return 0;//完结散花
}

码字不易,求赞!