C. Thor
time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

Thor is getting used to the Earth. As a gift Loki gave him a smartphone. There are napplications on this phone. Thor is fascinated by this phone. He has only one minor issue: he can't count the number of unread notifications generated by those applications (maybe Loki put a curse on it so he can't).

q events are about to happen (in chronological order). They are of three types:

  1. Application x generates a notification (this new notification is unread).
  2. Thor reads all notifications generated so far by application x (he may re-read some notifications).
  3. Thor reads the first t notifications generated by phone applications (notifications generated in first t events of the first type). It's guaranteed that there were at least tevents of the first type before this event. Please note that he doesn't read first t unread notifications, he just reads the very first t notifications generated on his phone and he may re-read some of them in this operation.

Please help Thor and tell him the number of unread notifications after each event. You may assume that initially there are no notifications in the phone.

Input

The first line of input contains two integers n and q (1 ≤ n, q ≤ 300 000) — the number of applications and the number of events to happen.

The next q lines contain the events. The i-th of these lines starts with an integer typei — type of the i-th event. If typei = 1 or typei = 2 then it is followed by an integer xi. Otherwise it is followed by an integer ti (1 ≤ typei ≤ 3, 1 ≤ xi ≤ n, 1 ≤ ti ≤ q).

Output

Print the number of unread notifications after each event.

Examples
input
3 4
1 3
1 1
1 2
2 3
output

input
4 6
1 2
1 4
1 2
3 3
1 3
1 3
output

Note

In the first sample:

  1. Application 3 generates a notification (there is 1 unread notification).
  2. Application 1 generates a notification (there are 2 unread notifications).
  3. Application 2 generates a notification (there are 3 unread notifications).
  4. Thor reads the notification generated by application 3, there are 2 unread notifications left.

In the second sample test:

  1. Application 2 generates a notification (there is 1 unread notification).
  2. Application 4 generates a notification (there are 2 unread notifications).
  3. Application 2 generates a notification (there are 3 unread notifications).
  4. Thor reads first three notifications and since there are only three of them so far, there will be no unread notification left.
  5. Application 3 generates a notification (there is 1 unread notification).
  6. Application 3 generates a notification (there are 2 unread notifications).

题意:给你n个邮箱,q个操作,1,y代表往y号邮箱塞一份信,2,y代表将y号邮箱内的信全部读完,

3,y代表将所有接收到的信(不管有没有读过)的前y封都读了,要求在每个操作之后输出未读的信数量;

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <map>
#include <vector>
#include <queue>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define MM(a,b) memset(a,b,sizeof(a));
#define inf 0x7f7f7f7f
#define FOR(i,n) for(int i=1;i<=n;i++)
#define CT continue;
#define PF printf
#define SC scanf
const int mod=1000000007;
const int N=3*1e5+10; queue<int> q;
int num[N],read[N],cnt[N];
int main()
{
int n,k,x,y;
while(~scanf("%d%d",&n,&k))
{
while(q.size()) q.pop();
MM(num,0);MM(read,0);MM(cnt,0);
int t=0,ans=0; for(int i=1;i<=k;i++)
{
scanf("%d%d",&x,&y);
if(x==1)
{
num[y]++;
ans++;
q.push(y);
}
else if(x==2)
{
ans-=num[y]-read[y];
read[y]=num[y];
}
else if(x==3)
{
while(t<y)
{
t++;
int u=q.front();q.pop();
cnt[u]++;
if(cnt[u]>read[u])
{
read[u]++;
ans--;
}
}
}
printf("%d\n",ans);
}
}
return 0;
}

  比赛分析:看到操作数是*1e5,又感觉是区间操作与询问,,首先就想到了线段树,然而却无法维护

3,y也就是读掉前y封信,这个操作,因为如果再开个数组维护前y封信的邮箱下标的话,复杂度肯定又上去了。。。

分析:其实只要模拟一遍就好,对于第三个操作,设置一个queue,记录顺序,最后最坏情况下每封信都

会进队一次,出队一次,再考虑q个操作,复杂度为q+n;

stack降低复杂度,主要是用于元素之间存在单调性;

queue降低复杂度,主要是用于元素只需遍历一次,不需要多次使用

CF #366 DIV2 C. Thor 模拟 queue/stack降低复杂度的更多相关文章

  1. Codeforces Round #366 (Div. 2) C 模拟queue

    C. Thor time limit per test 2 seconds memory limit per test 256 megabytes input standard input outpu ...

  2. 1. 模拟Queue

    package com.gf.conn009; import java.util.LinkedList; import java.util.concurrent.atomic.AtomicIntege ...

  3. stl容器学习——queue,stack,list与string

    目录 头文件 string 目录部分 1.string的定义及初始化 ① 用一个字符串给另一个字符串赋值 ②用字符串常量对字符串进行赋值 ③ 用n个相同的字符对字符串赋值 2.string的运算符及比 ...

  4. cf 442 div2 F. Ann and Books(莫队算法)

    cf 442 div2 F. Ann and Books(莫队算法) 题意: \(给出n和k,和a_i,sum_i表示前i个数的和,有q个查询[l,r]\) 每次查询区间\([l,r]内有多少对(i, ...

  5. wait , notify 模拟 Queue

    package com.itdoc.multi.sync009; import java.util.LinkedList; import java.util.concurrent.TimeUnit; ...

  6. Codeforces #366 Div. 2 C. Thor (模拟

    http://codeforces.com/contest/705/problem/C 题目 模拟题 : 设的方法采用一个 r 数组(第几个app已经阅读过的消息的数量),和app数组(第几个app发 ...

  7. [CF]codeforces round#366(div2)滚粗记

    开场心理活动:啊打完这场大概有1700了吧 中途心理活动:啊这个ABC看起来都随便做啊 死亡原因:欸怎么没网了 -75 .. A [题意]Hulk说完一句I hate会说that I love 然后是 ...

  8. codeforces 705C C. Thor(模拟)

    题目链接: C. Thor time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  9. CodeForces 705C Thor (模拟+STL)

    题意:给定三个操作,1,是x应用产生一个通知,2,是把所有x的通知读完,3,是把前x个通知读完,问你每次操作后未读的通知. 析:这个题数据有点大,但可以用STL中的队列和set来模拟这个过程用q来标记 ...

随机推荐

  1. MySQL5.7,MySQL8 pfs,sys库使用

    MySQL5.7中performance和sys schema中的监控参数解释 在MySQL5.7中,performance schema有很大改进,包括引入大量新加入的监控项.降低占用空间和负载,以 ...

  2. Linux磁盘挂载、分区、扩容操作

    本文最早发布于 Rootrl's blog 注:以下操作系统环境为CentOS7 基本概念 在操作前,首先要了解一些基本概念 磁盘 在Linux系统中所有的设备都会以文件的形式存储.设备一般保存在/d ...

  3. 本地连接Linux工具

    连接Linux命令 finaXshell 工具好用: 链接:https://pan.baidu.com/s/13yyOhi7GzcZNTxXseGO_fA 提取码:n4t6 上次Linux 文件工具: ...

  4. webpack自定义loader并发布

    一.官网对loader的解释: 1.loader 是导出为一个函数的 node 模块.该函数在 loader 转换资源的时候调用.给定的函数将调用 loader API,并通过 this 上下文访问. ...

  5. java——HashSet中add()方法不能加重复值得原因理解(我们一起来看底层代码吧)

    Set<String> names = new HashSet<>(); names.add("张三"); names.add(new String(&qu ...

  6. java三大框架——Struts + Hibernate + Spring

    Struts主要负责表示层的显示 Spring利用它的IOC和AOP来处理控制业务(负责对数据库的操作) Hibernate主要是数据持久化到数据库 再用jsp的servlet做网页开发的时候有个 w ...

  7. Python中文分词组件 jieba

    jieba "结巴"中文分词:做最好的Python中文分词组件 "Jieba" Feature 支持三种分词模式: 精确模式,试图将句子最精确地切开,适合文本分 ...

  8. 数据集:Introduction to Econometrics by Stock&Watson

    James H. Stock and Mark W. Watson, Introduction to Econometrics: data sets 詹姆斯·H·斯托克 马克·W·沃森. 计量经济学. ...

  9. 乐观锁之版本号机制和CAS

    ---恢复内容开始--- 乐观锁:每次去拿数据的时候,都认为别人不会修改,不会加锁,但在更新的时候会去判断一下,此期间别人有没有更新数据,版本号机制和CAS算法就用到乐观锁,参考了https://bl ...

  10. MySQL表内更新时,自动记录时间

    1.创建表: create table test_time(id int primary key not null,status  varchar(24),create_time datetime d ...