CF #366(div.2) C 模拟,思维
题意:一个手机n个联系人,有q个操作。每次给出ty和ai,如ty==1,表示收到ai的一条信息;如ty==2,表示将ai发的信息都看掉;如ty==3,表示将第1条到第ai条信息都看掉(看过的再看也算)。求每次操作后有多少条信息是没看的。
总结:思维题,看着简单,但就是不好做。。看了一个神犇的代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//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); } }