题意:有n个队列,操作1,向x号队列放一个消息。操作2,读取x队列的所有消息。操作3读取前t个放入的消息。
思路:
一开始读错题意了。。。
暴力模拟,开n个队列,操作1直接向相应队列放元素,操作2,将相应队列清空,操作3,找到相应的数所在的队列,将其从队列中删除。因为每个元素最多被加入一次、删除一次,所以时间复杂度应该是O(n)的。
ac代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<string>
#include<vector>
#include<unordered_map>
#define mod (1000000007)
using namespace std;
typedef long long ll;
const int maxn = 3e5 + 100;
const ll inf = 1e14;
struct nod{
int num,tim;
nod(){}
nod(int nn,int ti):num(nn),tim(ti){}
};
queue<nod> que[maxn];//vector用erase超时换成队列
int wi[maxn],tot=0;
int main() {
int n,q,op,x,ans=0,las=0;
scanf("%d%d",&n,&q);
while(q--){
scanf("%d%d",&op,&x);
if(op==1){
wi[++tot]=x;
ans++;
que[x].push(nod(1,tot));
}
else if(op==2){
ans-=que[x].size();
while(!que[x].empty())wi[que[x].front().tim]=-1,que[x].pop();
}
else{
int num=0;
if(x>las){
for(int i=las+1;i<=x;i++){
if(wi[i]==-1)continue;
que[wi[i]].pop();
wi[i]=-1;
ans--;
}
las=x;
}
}
printf("%d\n",ans);
}
return 0 ;
}