记录编号 |
382161 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[SDOI 2007] 小组队列 |
最终得分 |
100 |
用户昵称 |
HeHe |
是否通过 |
通过 |
代码语言 |
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
}
}
}