CF #366(div.2) C 模拟,思维

CF #366(div.2)  C.  Thor   

题意:一个手机n个联系人,有q个操作。每次给出ty和ai,如ty==1,表示收到ai的一条信息;如ty==2,表示将ai发的信息都看掉;如ty==3,表示将第1条到第ai条信息都看掉(看过的再看也算)。求每次操作后有多少条信息是没看的。

总结:思维题,看着简单,但就是不好做。。看了一个神犇的代码

//CF#366 C
#include<cstdio>
using namespace std;

int n, q, k, v, x, y, t, a[300300], b[300300], c[300300];
//x表示按第3种最大的右边界,a[]表示按第1种输入进去的数,b[]表示x后面没有看的数量,c[]表示x后面ai出现次数
int main() {
    scanf("%d%d", &n, &q);
    while (q--) {
        scanf("%d%d", &k, &v);
        if (k == 1)   a[++y] = v, b[v]++, c[v]++, t++;
        else if (k == 2)   t -= b[v], b[v] = 0;
        else {
            while (x < v) { //关键
                n = a[++x];  
                if (c[n]) c[n]--;  //x~v, 将a[x]出现次数-1
                if(b[n] > c[n]) t--, b[n]--;  //b[]肯定是要<=c[]的,如果b[]>c[],表示a[x]要看掉一个
            }
        }
        printf("%d\n", t);
    }
}
View Code
posted @ 2017-01-17 13:45  v9fly  阅读(314)  评论(0编辑  收藏  举报