luogu 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,输入保证操作合法。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>

using namespace std;
const int N=310;

queue<int>vec[N];
int peo,group;
int belong[99999];
queue<int>comein;
bool vis[N];
string work;
int me;

int main()
{
    scanf("%d%d",&peo,&group);
    for(int i=0;i<peo;i++)
        scanf("%d",&belong[i]);
    int Q;
    scanf("%d",&Q);
    while(Q--)
    {
        cin>>work;
        if(work[1]==‘u‘)
        {
            scanf("%d",&me);
            int zu=belong[me];
            if(!vis[zu])
            {
                comein.push(zu);
                vec[zu].push(me);
                vis[zu]=1;
            }
            else
                vec[zu].push(me);
        }
        else
        {
            int xiaozu=comein.front();
            int cou=vec[xiaozu].front();
            printf("%d\n",cou);
            vec[xiaozu].pop();
            if(vec[xiaozu].size()==0)
                comein.pop(),vis[xiaozu]=0;
        }
    }

    return 0;
}
时间: 2024-08-13 11:00:10

luogu P2776 [SDOI2007]小组队列的相关文章

P2776 [SDOI2007]小组队列

题目背景 嘛,这道非常简单的给大家提供信心的省选题洛谷居然没有! 这么简单的题怎么可以没有! 给大家提升士气是义不容辞的责任! 所以我就来补一下啦.. 值得一提的是,标程是我自己做的.. 很渣,因为数据很水所以能AC.. 大神勿喷.. 题目描述 有 m 个小组, n 个元素,每个元素属于且仅属于一个小组. 支持以下操作: push x:使元素 x 进队,如果前边有 x 所属小组的元素,x 会排到自己小组最后一个元素的下一个位置,否则 x 排到整个队列最后的位置. pop:出队,弹出队头并输出出队

[luogu P3960] [noip2017 d2t3] 队列

[luogu P3960] [noip2017 d2t3] 队列 题目描述 Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有n \times mn×m名学生,方阵的行数为 nn,列数为 mm. 为了便于管理,教官在训练开始时,按照从前到后,从左到右的顺序给方阵中 的学生从 1 到 n \times mn×m 编上了号码(参见后面的样例).即:初始时,第 ii 行第 jj 列 的学生的编号是(i-1)

luogu 2827 蚯蚓 单调队列/优先队列

易知可利用优先队列选取最大值: 但是通过分析可知,先取出的蚯蚓分开后仍然要比后分的长,所以可直接利用单调队列找队头即可,分三个单调队列,分别找未切割,切割,切割2三种情况 #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i<=y;i++) #define ll long long using namespace std; const int inf=2147483647; const int N=1e5+5;

LUOGU P2564 [SCOI2009]生日礼物 (队列+模拟)

传送门 解题思路 还是比较好想的,用一个队列,然后把所有点放在一起排个序,依次入队.每次检查队头元素的种类是否为当前入队元素种类,是的话就一直\(pop\),每次更新答案即可. 代码 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> using namespace std;

luogu 2569 股票交易 单调队列dp

注意转移方程 分1.凭空买 2.不买不卖 3.在原来基础上买 4.在原来基础上卖 四种情况 head=1,tail=0;再判断一下head<=tail也可以 #include<bits/stdc++.h> using namespace std; const int N=2010; int n,m,w,ans; int ap[N],bp[N],as[N],bs[N]; int f[N][N]; int q[10000],head=1,tail=0; int main() { scanf(

单调队列 单调栈

建议不了解STL的读者先了解几个基本的队列的STL.这也是单调队列和单调栈一般都会用到的. 单调队列:建立一个队列,使队列一直具有单调性(满足单调递增或者单调递减),时间复杂度O(N). 那么我们应该如何做到"使队列一直具有单调性"呢? 以单调递增为例,我们O(N)扫描整个序列,每扫描到一个元素: 1 如果该元素大于等于队列末尾元素,则直接入队; 2 而如果该元素小于已有队列的末尾元素,即不满足单调递增,则使队列中的末尾元素出队,直到该元素符合入队条件,然后入队. 如果只到这里,那么我

P1440 求m区间内的最小值

第二道单调队列. 这道题就是经典的滑动窗口问题了.要求你求某一个数的前\(m\)位中的最小元素. 先说一句话:单调队列中,队首保存的是最优解,其实是次解,以此类推. 所以我们可以构造一个上升的单调队列,队首弄出来的就是答案. 元素的加入不用说,就是那样子. 重点是这里多了元素的删除.因为窗口的长度有限,你需要把当前窗口没有覆盖住的那些点给pop掉. 可以发现,你要删除的点一定是在队首!并且每一个时刻的最优解也还是队首. 我们只需要加入一个点的同时记录它的加入时间,然后判断是否合法即可. 不知道是

【Luogu】P2827蚯蚓(堆转队列)

按照国际惯例先发题目链接? woc从4月就开始做这sb题.最开始30分升到65分不管了,直到最近几天升到85分,再到今天AC.激动的心情自然是那些一遍就A或者一小时以内就A的神犇难以想象的. 下面说说主要几个分段. # 35分 按题意用堆模拟.每次暴力修改蚯蚓长度,于是get皮肤:TLE蓝. # 65分 考虑到暴力修改消耗的时间复杂度过大,于是考虑偷懒.既然我们不能暴力增长已经存进堆的蚯蚓长度,那就剪短将要存进堆的蚯蚓长度.将目前蚯蚓增加的长度记为mark,从堆里取出来的蚯蚓长度+mark,要存

LUOGU P2569 [SCOI2010]股票交易(单调队列优化dp)

传送门 解题思路 不难想一个\(O(n^3)\)的\(dp\),设\(f_{i,j}\)表示第\(i\)天,手上有\(j\)股的最大收益,因为这个\(dp\)具有单调性,所以\(f_i\)可以贪心的直接从\(f_{i-w-1}\)那一层转移来,转移时枚举一下当前买卖多少.考虑优化,发现每次其实就是一个区间取\(max\),是由\(AS\)和\(BS\)所限制的区间,所以单调队列优化就好了,一个正着做一个倒着做,时间复杂度\(O(n^2)\) 代码 #include<bits/stdc++.h>