题目:
三种操作:
1. 向队列加入一个数
2. 给定一个数,删除队列中的所有的这个数
3. 删除队列前N个元素(可能重复删除已删除的元素)
题解:
模拟。
CF不卡常。
卡常是因为你写挫了。
#include<iostream>
#include<stack>
#include<queue>
#include<cstdio>
using namespace std;
struct S{
int bit,x;
S(){}
S(int bit,int x){
this->bit=bit;
this->x=x;
}
};
queue<int> que[301000];
queue<S> qqq;
int main(){
int n,m;
scanf("%d%d",&n,&m);
int last=0;
int bit=0;
int num=0;
while(m--){
int a,b;
scanf("%d%d",&a,&b);
if(a==1){
que[b].push(bit);
qqq.push(S(bit,b));
bit++;
num++;
}
else if(a==2){
num -= que[b].size();
while(!que[b].empty()){
que[b].pop();
}
}
else{
while(!qqq.empty()&&qqq.front().bit<b){
S now=qqq.front();
if(!que[now.x].empty()&&que[now.x].front()==now.bit){
que[now.x].pop();
num--;
}
qqq.pop();
}
}
printf("%d\n",num);
}
}