codeforces 704A (队列模拟) Thor

题目:这里

题意:n个app,q个操作,当操作数type为1的时候表示y这个app推送了你一条消息,当操作数type为2的时候表示将y这个app已推送的所有消息都读完,当操作数为3的时候

表示将已经推送的前(按推送的时间顺序)y条消息再读一遍(不管这前y条消息中有没有读过的,都再读一遍),问每次操作的时候的未读的消息数是多少?

用队列来模拟就好,记得每次要输出的是所有app的没有读过的消息的总数就行,不要想的太细,把读过的标记一下就行,总是觉得这个会超时,但是一想这才是2的第三题,1

的第一题,应该不会那么卡时间,所有就大着胆子写了。

 1 //队列只要记录cas就行了,并不需要记录y
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 #include<cstring>
 7 #include<queue>
 8 using namespace std;
 9
10 const int M = 3e5 + 10;
11 bool vi[M];
12 queue<pair<int,int> >q[M];
13
14 int main()
15 {
16     int n,m;
17     long long ans=0;
18     scanf("%d%d",&n,&m);
19     int po=1,cas=0,r=0;
20     memset(vi,false,sizeof(vi));
21     while (m--)
22     {
23         int x,y;
24         scanf("%d%d",&x,&y);
25         if (x==1) q[y].push(make_pair<int,int>(y,++cas)),ans++;
26         else if (x==2) {
27             while (!q[y].empty())
28             {
29                 int w=q[y].front().second;
30                 if (vi[w]==false) ans--;
31                 vi[w]=true;
32                 q[y].pop();
33             }
34         }
35         else {
36             for (int i=po ; i<=min(cas,y) ; i++)
37             {
38                  if (vi[i]==false) ans--;
39                  vi[i]=true;
40             }
41             po=max(po,y);
42         }
43         printf("%I64d\n",ans);
44     }
45     return 0;
46 }
时间: 2024-10-10 04:25:02

codeforces 704A (队列模拟) Thor的相关文章

Codeforces 704A Thor 队列模拟

题目大意:托尔有一部手机可执行三种操作 1.x APP产生一个新消息 2.读取x App已产生的所有消息 3.读取前t个产生的消息 问每次操作后未读取的消息的数量 题目思路: 队列模拟,坑点在于竟然卡内存……详细看代码. #include<iostream> #include<algorithm> #include<cstring> #include<vector> #include<stdio.h> #include<stdlib.h&g

用两个队列模拟实现一个栈的过程

栈具有"后进先出"的特点,即某个元素最后进入栈,却最先出栈:队列具有"先进先出"的特点,即元素从队尾依次进队列,依次从队头出队列:现在用两个队列模拟实现一个栈的过程,详细过程请看下面这张本人制作的gif图: 实现代码: #include <iostream> using namespace std; #include <queue> template <typename T> class Stack { public: void

火车车厢重排问题--队列模拟

①问题描述 一列货运列车共有n节车厢,每节车厢将停放在不同的车站.假定n个车站的编号分别为1-n,即货运列车按照第n站至第1站的次序经过这些车站.为了便于从列车上卸掉相应的车厢,车厢的编号应与车站的编号相同,这样,在每个车站只要卸掉最后一节车厢.所以,给定任意次序的车厢,必须重新排列它们. 车厢的重排工作可以通过转轨站完成.在转轨站中有一个入轨.一个出轨和k个缓冲轨,缓冲轨位于入轨和出轨之间.假定缓冲轨按先进先出的方式运作,设计算法解决火车车厢重排问题. ②基本要求 设计存储结构表示n个车厢.k

用队列模拟基数排序

function Queue() { //用队列模拟基数排序对应的Queue构造函数中的方法一个都不能少,否则会出错 this.dataStore = []; this.enqueue = enqueue; this.dequeue = dequeue; this.empty = empty; } function enqueue(element) {//向队尾添加一个元素 this.dataStore.push(element); } function dequeue() {//删除队首的元素

栈模拟队列 队列模拟栈

代码如下: PS:做了一些测试,目前没问题.有问题请指正... 栈模拟队列 队列模拟栈

两个栈模拟一个队列和两个队列模拟一个栈

此为网易的一道笔试题.到时候秀逗,不知所云.后来研究之后记录下,以备以后经常翻阅. 栈:先进后出 push和pop 队列:先进先出 offer和poll (1)两个栈模拟一个队列 即将先进后出实现先进先出.比较容易理解,只要所有数据先往一个栈里push,然后将该栈中的数据依次pop出来再push进第二个队列,则顺序自然颠倒过来了,则每次pop是从第二个队列中取数据. import java.util.*; public class StackQueue{ private Stack<Intege

NYOJ714 Card Trick 【队列模拟】

Card Trick 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 The magician shuffles a small pack of cards, holds it face down and performs the following procedure: The top card is moved to the bottom of the pack. The new top card is dealt face up onto the table.

7 两个栈模拟队列,两个队列模拟栈

利用两个栈模拟队列 stack1,stack2 首先向stack1当中放入数据,如果需要输出数据,从stack2中delete数据,如果stack2为空,就把stack1中数据导入stack2 <span style="font-size:14px;">#include "static.h" #include <iostream> #include <stack> template<typename T> class

简单数据结构之队列模拟

1 /************************************************************************************** 2 * Function : 模拟队列 3 * Create Date : 2014/04/23 4 * Author : NTSK13 5 * Email : [email protected] 6 * Copyright : 欢迎大家和我一起交流学习,转载请保持源文件的完整性. 7 * 任何单位和个人不经本人允许不