• P2776 [SDOI2007]小组队列


    题目背景

    嘛,这道非常简单的给大家提供信心的省选题洛谷居然没有!

    这么简单的题怎么可以没有!

    给大家提升士气是义不容辞的责任!

    所以我就来补一下啦..

    值得一提的是,标程是我自己做的..

    很渣,因为数据很水所以能AC..

    大神勿喷..

    题目描述

    有 m 个小组, n 个元素,每个元素属于且仅属于一个小组。

    支持以下操作:

    push x:使元素 x 进队,如果前边有 x 所属小组的元素,x 会排到自己小组最后一个元素的下一个位置,否则 x 排到整个队列最后的位置。

    pop:出队,弹出队头并输出出队元素,出队的方式和普通队列相同,即排在前边的元素先出队。

    输入输出格式

    输入格式:

    第一行有两个正整数 n, m,分别表示元素个数和小组个数,元素和小组均从 0 开始编号。

    接下来一行 n 个非负整数 Ai,表示元素 i 所在的小组。

    接下来一行一个正整数 T ,表示操作数。

    接下来 T 行,每行为一个操作。

    输出格式:

    对于每个出队操作输出一行,为出队的元素。

    输入输出样例

    输入样例#1:
    4 2
    0 0 1 1
    6
    push 2
    push 0
    push 3
    pop
    pop
    pop
    输出样例#1:
    2
    3
    0

    说明

    对于30%的数据,1≤n≤100,1≤m≤10,T≤50。

    对于100%的数据,1≤n≤100000,1≤m≤300,T≤100000,输入保证操作合法。

    第一次用到二维队列

    用last来表示每一个小组内元素出现的顺序

    q队列表示每一个小组出现的顺序

    我们想一下,如果一个元素所属的小组在之前出现过

    那么我们直接加到last队列里就好

    这样可以保证按照小组的顺序输出

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<queue>
     6 using namespace std;
     7 int read(int & n)
     8 {
     9     char c='.';int x=0,flag=0;
    10     while(c<'0'||c>'9')
    11     {
    12         c=getchar();
    13         if(c=='-')flag=1;
    14     }
    15     while(c>='0'&&c<='9')
    16     {
    17         x=x*10+(c-48);
    18         c=getchar();
    19     }
    20     if(flag==1)n=-x;
    21     else n=x;
    22 }
    23 const int MAXN=10000001;
    24 queue<int>q,last[301];
    25 int group[MAXN];
    26 int main()
    27 {
    28     int n,m,p,meiyong;
    29     read(n);read(meiyong);
    30     for(int i=0;i<n;i++)
    31         read(group[i]);
    32     read(m);
    33     for(int i=1;i<=m;i++)
    34     {
    35         string s;
    36         cin>>s;
    37         if(s=="push")
    38         {
    39             read(p);
    40             if(last[group[p]].empty())
    41             q.push(group[p]);
    42                 last[group[p]].push(p);
    43         }
    44         else
    45         {
    46             printf("%d
    ",last[q.front()].front());
    47             last[q.front()].pop();
    48             if(last[q.front()].empty())
    49             q.pop();
    50             
    51         }
    52     }
    53     return 0;
    54 }
  • 相关阅读:
    http协议
    三次握手四次挥手的原理
    mmap
    I/O多路复用之poll
    I/O多路转接之select
    自旋锁、文件锁、大内核锁
    网络基础(一)
    线程同步之(信号量)
    进程与线程的简单理解
    内存溢出——程序员必备网站
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/7041370.html
Copyright © 2020-2023  润新知