(洛谷)Thor

题目描述

Thor is getting used to the Earth. As a gift Loki gave him a smartphone. There are nn applications 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).

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

  1. Application xx generates a notification (this new notification is unread).
  2. Thor reads all notifications generated so far by application xx (he may re-read some notifications).
  3. Thor reads the first tt notifications generated by phone applications (notifications generated in first tt events of the first type). It's guaranteed that there were at least tt events of the first type before this event. Please note that he doesn't read first tt unread notifications, he just reads the very first tt 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.

输入格式

The first line of input contains two integers nn and qq ( 1<=n,q<=300000 ) --- the number of applications and the number of events to happen.

The next qq lines contain the events. The ii -th of these lines starts with an integer type_{i}typei​ --- type of the ii -th event. If type_{i}=1typei​=1 or type_{i}=2typei​=2 then it is followed by an integer x_{i}xi​ . Otherwise it is followed by an integer t_{i}ti​ ( 1<=type_{i}<=3,1<=x_{i}<=n,1<=t_{i}<=q1<=typei​<=3,1<=xi​<=n,1<=ti​<=q ).

输出格式

Print the number of unread notifications after each event.

题意翻译

(可能无关紧要的地方有点漏洞,但不会影响题意) 【题目描述】

雷神常常要去地球,所以洛基给一款智能手机作为礼物。手机上安装了n款应用,每款应用都会跳出很多消息,在每一单位时间,会发生以下3种事件之一:

    1. 第x个应用跳出了一条消息
    1. 雷神读了第x个应用跳出的所有消息
    1. 雷神读了所有应用跳出的前x条消息

雷神很不喜欢手机上有一堆"99+",所以希望知道,每一分钟后有多少条新消息未读。

【输入格式】

第一行2个整数n,q表示应用的数目和事件总数

接下来有q行,每行2个整数i,x表示发生事件i(i=1,2,3即与题目描述中的序号对应)和事件中的x

【输出格式】

共q行,每行一个整数表示每个事件发生后有多少未读消息

【输入样例1】

复制代码
3 4
1 3
1 1
1 2
2 3

【输出样例1】

复制代码
1
2
3
2

【输入样例2】

复制代码
4 6
1 2
1 4
1 2
3 3
1 3
1 3

【输出样例2】

复制代码
1
2
3
0
1
2

【数据范围】 对于100%的数据,满足1<=n,q<=300000,且保证每个事件合法。

输入输出样例

输入 #1复制

复制代码
3 4
1 3
1 1
1 2
2 3

输出 #1复制

复制代码
1
2
3
2

输入 #2复制

复制代码
4 6
1 2
1 4
1 2
3 3
1 3
1 3

输出 #2复制

复制代码
1
2
3
0
1
2

说明/提示

In the first sample:

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

In the second sample test:

  1. Application 22 generates a notification (there is 11 unread notification).

  2. Application 44 generates a notification (there are 22 unread notifications).

  3. Application 22 generates a notification (there are 33 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 33 generates a notification (there is 11 unread notification).

  6. Application 33 generates a notification (there are 22 unread notifications).

    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<queue>
    using namespace std;
    typedef long long ll;
    const int N = 3e5 + 10;
    queue<int> que[N]; //队列数组,存储每个app的信息
    queue<pair<int, int>> t;
    ll v[N]; //判定某条信息是否被读过
    ll n, q;
    ll cnt = 1; //信息序号从1开始计算
    ll sum = 0;//总信息量
    int main()
    {
    scanf_s("%lld%lld", &n, &q);
    for (ll i = 1; i <= q; i++)
    {
    ll a, b; scanf_s("%lld%lld", &a, &b);
    if (a == 1)
    {
    sum++; //未读信息总数加一
    que[b].push(cnt); //b号app存储的是第几条信息
    t.push({ cnt,b });//存储第cnt条信息的是b号app
    cnt++; //未读信息序号自增
    }

    复制代码
     	if (a == 2)
     	{
     		while (que[b].size())  //当b号app的信息未读完时
     		{
     			v[que[b].front()] = 1;  //标为已读
     			que[b].pop();          //删除已读的信息,只存未读信息
     			sum--; //总信息量减一
     		}
     	}
    
     	if (a == 3)
     	{
     		//这里有个坑,读的所有应用的前x条信息可能包含在2时读过的,要特殊处理
     		while (t.size() && t.front().first <= b) 
     		{
     			if (!v[t.front().first])  //检查该信息是否被读过
     			{
     				v[t.front().first] = 1;
     				que[t.front().second].pop();
     				sum--;
     			}
     			t.pop();
     		}
     	}
     	cout << sum << endl;
     }
     return 0;

    }

相关推荐
蒋星熠2 小时前
Flutter跨平台工程实践与原理透视:从渲染引擎到高质产物
开发语言·python·算法·flutter·设计模式·性能优化·硬件工程
小欣加油2 小时前
leetcode 面试题01.02判定是否互为字符重排
数据结构·c++·算法·leetcode·职场和发展
3Cloudream2 小时前
LeetCode 003. 无重复字符的最长子串 - 滑动窗口与哈希表详解
算法·leetcode·字符串·双指针·滑动窗口·哈希表·中等
王璐WL2 小时前
【c++】c++第一课:命名空间
数据结构·c++·算法
空白到白3 小时前
机器学习-聚类
人工智能·算法·机器学习·聚类
索迪迈科技3 小时前
java后端工程师进修ing(研一版 || day40)
java·开发语言·学习·算法
zzzsde3 小时前
【数据结构】队列
数据结构·算法
芒克芒克4 小时前
LeetCode 面试经典 150 题:删除有序数组中的重复项(双指针思想解法详解)
算法
青 .4 小时前
数据结构---二叉搜索树的实现
c语言·网络·数据结构·算法·链表
MChine慕青4 小时前
顺序表与单链表:核心原理与实战应用
linux·c语言·开发语言·数据结构·c++·算法·链表