Codeforces Round #366 (Div. 2) C Thor(模拟+2种stl)

Thor

题意:

第一行n和q,n表示某手机有n个app,q表示下面有q个操作。
操作类型1:app x增加一条未读信息。
操作类型2:一次把app x的未读信息全部读完。
操作类型3:按照操作类型1添加的顺序,按顺序读t条信息,注意这t条信息可能有的已经读过。如果读过也算前t条,会再读一遍。
最后输出每次操作有多少信息没读。

题解:

一看题,要30W,那肯定不可以n^2了,想一想,3种操作,一个vector够用吗,应该不够,所以再加个set,就差不多了。那么思路就是这样的:
首先要有个计数器cnt,从1开始,他的作用是为了第3个操作的,这样就可以知道那些是前x个了,就不会多删掉。之后vei[x]放cnt,如果2操作,就先根据vei[x][0]~vei[x][vei.size()]把set里的删去,之后在vei[x].claer()就好了。

代码:

#include <bits/stdc++.h>
using namespace std;

const int MAXN = 300000 + 9 ;

vector<int>vei[MAXN];
set<int>sei;
int n, q, a, x, cnt = 1;

int main()
{
    cin >> n >> q;
    for(int i = 0; i < q; i++)
    {
        cin >> a >> x;
        if(a == 1)
        {
            vei[x].push_back(cnt);
            sei.insert(cnt++);
        }
        else if(a == 2)
        {
            for(int j = 0; j < vei[x].size(); j++)
            {
                sei.erase(vei[x][j]);
            }
            vei[x].clear();
        }
        else
        {
            while(1)
            {
                if(*sei.begin() > x || sei.empty()) break;
                else sei.erase(*sei.begin());
            }
        }
        cout << sei.size() << endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/s1124yy/p/5750478.html