luogu P2776 [SDOI2007]小组队列
Posted ioioioioioio
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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; }
以上是关于luogu P2776 [SDOI2007]小组队列的主要内容,如果未能解决你的问题,请参考以下文章
题解 luogu P4415 [COCI2006-2007#2] KOLONE