嘛,这道非常简单的给大家提供信心的省选题洛谷居然没有!
这么简单的题怎么可以没有!
给大家提升士气是义不容辞的责任!
所以我就来补一下啦..
值得一提的是,标程是我自己做的..
很渣,因为数据很水所以能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\n",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 }