zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    数论练习
    AC自动机*
    矩阵乘法*
    概率期望*
    组合数学练习*
    图论升级*
    【终端使用】"su"命令切换用户
    【终端使用】"which"命令可以查看执行命令所在的位置
    【终端使用】"usermod"命令 和 组(包括:主组、附加组)
    Ubuntu 18.04安装 MySQL 8.0+版本的数据库
  • 原文地址:https://www.cnblogs.com/s1124yy/p/5750478.html
Copyright © 2011-2022 走看看