记录编号 382161 评测结果 AAAAAAAAAA
题目名称 [SDOI 2007] 小组队列 最终得分 100
用户昵称 GravatarHeHe 是否通过 通过
代码语言 C++ 运行时间 0.300 s
提交时间 2017-03-13 09:39:51 内存使用 0.67 MiB
显示代码纯文本
//717.[SDOI2007]小组队列  \
g++ 717.小组队列.cpp -ggdb -D LOCAL -D debug \
手动编译时用的命令,不用管

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#ifdef debug
	#include<cstdlib>
#endif
using namespace std;

#define is_num(tmp) (tmp<='9' and tmp>='0')
#define MAXN 310
#define MAXX 100010

inline int in(void){
	char tmp=getchar();
	int res=0, f=1;
	while(!(is_num(tmp)||tmp=='-'))tmp=getchar();
	if(tmp=='-')f=-1, tmp=getchar();
	while(is_num(tmp))
		res=(res<<1)+(res<<3)+(tmp^48),
		tmp=getchar();
	return res*f;
}

#ifdef debug
	int cnt;
#endif

char com[10];
int N, k, tmp, arg;
int team[MAXX];
#ifndef debug
	queue<int>que, group[MAXN];//que是整个队列,group是每个小组的
#else
	int que[MAXN], group[MAXN];
	int front, back; 
#endif

int main(){
#ifndef LOCAL
	freopen("team.in", "r", stdin);
	freopen("team.out", "w", stdout);
#endif
#ifdef debug //debug用
	freopen("test.in", "r", stdin);
#endif
	
	N=in();
	for(int i=1; i<=N; ++i){
		k=in();
		for(int j=1; j<=k; ++j){
			team[in()]=i;
		}
	}//读入数据
	
	while(true){
		scanf("%s", com);//输入命令
		#ifdef debug
			++cnt;
			printf("com = %c, cnt = %d\n", com[0], cnt);
		#endif
		if(*com=='S')return 0;//结束程序
		if(*com=='E'){
			arg=in();
			#ifdef debug
				printf("arg = %d, team[arg] = %d\n", arg, team[arg]);
				if(!group[team[arg]]){
					que[back++]=team[arg];
				}
				++group[arg];
			#else
				if(group[team[arg]].empty()){//最糟糕的情况
					que.push(team[arg]);//该小组入总队
				}
				group[team[arg]].push(arg);//这个人入该小组的队列
			#endif
		}
		else{
			#ifdef debug
				printf("now = %d\n", que[front]);
				--group[que[front]];
				if(!group[que[front]])++front;
			#else
				int now=que.front();
				printf("%d\n", group[now].front());//出队的人
				group[now].pop();
				if(group[now].empty())que.pop();//如果该小组没人了,这个小组出队
			#endif
		}
	}
}