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

http://codeforces.com/contest/705/problem/C 题目

模拟题 : 设的方法采用一个 r 数组(第几个app已经阅读过的消息的数量),和app数组(第几个app发出的消息的总数),加上一个 q 队列。

思路:

查询==1的时候,入队(记录顺序), sum++ (sum 为全部的剩余 没阅读的数量)

查询==2的时候,针对一个app,sum -(这个app发出的消息的总数 - 这个app已经阅读过的消息的数量),然后用 app数组 更新 r 数组,表示这个app的全部的消息都已经被阅读过了。

查询==3的时候,采用 q.front 和 q.pop() 的方法一个一个出队,t 为要阅读 队列前面 t 个数量的消息,但是因为有出队的过程,所以出队的数量要用cnt记录,t= t - cnt 。 按顺序出队,当 某一个app消息的数量 > 这个app已经读过的消息的数量(即这个app存在还没被读过的消息),sum就减去 “没被读过的消息的数量”,更新 r 数组。

#include<iostream>
#include<cstdio>
#include <cctype>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>
#include<cmath>
#include<set>
#include<vector>
#include<stack>
#include<queue>
#include<map>
using namespace std;
#define ll long long
#define mem(a,x) memset(a,x,sizeof(a))
#define se second
#define fi first
const int INF= 0x3f3f3f3f;
const int N=3e5+5;

int n,m,x,t,c,cnt=0;
ll sum=0;  //查询的答案
int r[N],app[N]; //读过的 和 总的
int num[N]={0};
queue<int>q;

int main()
{
    cin>>n>>m;
    while(m--)
    {
        scanf("%d",&c);
        if(c==1)
        {
            scanf("%d",&x);

            sum++;
            q.push(x); //存第几种app
            app[x]++;
        }
        if(c==2)
        {
            scanf("%d",&x);

            sum-= app[x]-r[x];
            r[x]=app[x];
        }
        if(c==3)
        {
            scanf("%d",&t);

            t-=cnt; //要减去 已经出队的数量 (题目要求可以阅读重复的信息)
            while(!q.empty()&&t>0)
            {
                int f=q.front();
                q.pop();
                cnt++;//出队数量
                num[f]++;
                if(num[f]>r[f])
                {
                    sum-=num[f]-r[f];
                    r[f]=num[f];
                }
                t--;
            }
        }
        cout<<sum<<endl;
    }
}

原文地址:https://www.cnblogs.com/thunder-110/p/9485881.html

时间: 2024-10-11 05:50:55

Codeforces #366 Div. 2 C. Thor (模拟的相关文章

Codeforces Round #366 (Div. 2) C. Thor

题意: 手机里有n个应用,有三类操作. 第一类,第x个应用产生一个提醒通知 第二类,阅读了第x个应用产生的所有提醒通知,可能重复阅读已经读过的. 第三类,阅读了从头开始产生的t个提醒通知,可能重复阅读已经读过的. 输出每个操作发生后未读消息的个数. 分析: 对产生的消息进行编号,编号唯一. 未读的消息构成一个上述产生消息的子集s. 每个消息属于特定的应用,每个应用产生的消息构成队列. 这样, 1操作同时维护应用x产生的队列和整个的消息集合. 2操作读取应用x的消息队列,然后删除集合s中的这些消息

Codeforces Round #259 (Div. 2) (简单模拟实现题)

题目链接:http://codeforces.com/problemset/problem/454/A A. Little Pony and Crystal Mine time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Twilight Sparkle once got a crystal from the Crystal Mine

Codeforces Round #366 (Div. 2) ABC

Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 1 #I hate that I love that I hate it 2 n = int(raw_input()) 3 s = "" 4 a = ["I hate that ","I love that ", "I hate it","I love it"] 5 fo

Codeforces #259 Div.2

A. Little Pony and Crystal Mine 模拟题. 用矩阵直接构造或者直接根据关系输出 B. Little Pony and Sort by Shift 模拟题. 通过提供的操作得到的序列只能是两段递增或者整个序列递增. 那么可以求得第一段递增序列长度为0-p 如果整个序列是递增,即 p= n-1 那么操作次数就是0. 否则,假设是两段递增,把原始的序列恢复出来,设当前序列是AB,那么A就是0-p BA = (A'B')', '表示对序列进行翻转, 如果BA是有序的,那么需

Codeforces #258 Div.2 E Devu and Flowers

大致题意: 从n个盒子里面取出s多花,每个盒子里面的花都相同,并且每个盒子里面花的多数为f[i],求取法总数. 解题思路: 我们知道如果n个盒子里面花的数量无限,那么取法总数为:C(s+n-1, n-1) = C(s+n-1, s). 可以将问题抽象成:x1+x2+...+xn = s, 其中0<=xi <= f[i],求满足条件的解的个数. 两种方法可以解决这个问题: 方法一:这个问题的解可以等价于:mul = (1+x+x^2+...+x^f[1])*(1+x+x^2+...+x^f[2]

Codeforces 97D Robot in Basement bitset+模拟

题目链接:点击打开链接 题意: 每个点有一个机器人(.),下面是一些指令,每次发出指令(一个字母)所有机器人都会执行移动. 当机器人到E点就会离开. 若机器人前方是'#' 或者边界则停留原地.一个方格可以站多个机器人. bitset模拟.. #include <cstdio> #include <cstring> #include <algorithm> #include <bitset> using namespace std; char s[100005

Codeforces #250 (Div. 2) C.The Child and Toy

之前一直想着建图...遍历 可是推例子都不正确 后来看数据好像看出了点规律 就抱着试一试的心态水了一下 就....过了..... 后来想想我的思路还是对的 先抽象当前仅仅有两个点相连 想要拆分耗费最小,肯定拆相应权值较小的 在这个基础上考虑问题就能够了 代码例如以下: #include <cstdio> #include <iostream> #include <algorithm> #define MAXN 10010 #define ll long long usi

Codeforces 12D Ball 树状数组模拟3个元素的排序

题目链接:点击打开链接 #include<stdio.h> #include<iostream> #include<string.h> #include<set> #include<vector> #include<map> #include<math.h> #include<queue> #include<string> #include<stdlib.h> #include<a

codeforces 459C Pashmak and Buses(模拟,组合数A)

题目 跑个案例看看结果就知道了:8 2 3 题目给的数据是 n,k,d 相当于高中数学题:k个人中选择d个人排成一列,有多少种不同的方案数,列出其中n中就可以了. #include<iostream> #include<algorithm> #include<string> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h>