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]出现次数-1if(b[n] > c[n]) t--, b[n]--; //b[]肯定是要<=c[]的,如果b[]>c[],表示a[x]要看掉一个 }}printf("%d\n", t);} }