2259 Team Queue

http://poj.org/problem?id=2259

概要

すでに同じチームの人間が並んでいれば、その人のすぐ後ろに入れるようなキューをシミュレートする。

方針

チーム内での順番と全体のチームの順番とを別々のキューで管理した。

ソース

#include<iostream>
#include<string>
#include<map>
#include<queue>
#include<cstring>
using namespace std;

const int inf = 1<<29;
const double eps = 1e-8;

#define REP(i,a,b) for(i=a; i<b; ++i)
#define rep(i,n) REP(i,0,n)

int main() {
  std::ios_base::sync_with_stdio(false);
  int team,n,i,j,k,scenum = 1,t;

  while(cin>>team, team) {
    cout<<"Scenario #"<<scenum<<endl;
    queue<int> teamqueue[team];
    queue<int> overall;
    map<int,int> id2team;
    string query;

    rep(i,team) {
      cin>>j;
      rep(k,j) {
	cin>>t;
	id2team.insert(make_pair(t,i));
      }
    }

    while(true) {
      cin>>query;
      if(query == "STOP") break;
      if(query == "ENQUEUE") {
	int nt;
	cin>>nt;
	if(teamqueue[id2team[nt]].empty()) {
	  overall.push(id2team[nt]);
	}
	teamqueue[id2team[nt]].push(nt);
      }else{
	int nt = overall.front();
	cout<<teamqueue[nt].front()<<endl;
	teamqueue[nt].pop();
	if(teamqueue[nt].empty()) overall.pop();
      }
    }

    cout<<endl;
    scenum++;
  }
}