TopCoder SRM 364 Div1 Easy Paintball

問題

n人がペイント球を投げる遊びをしている。
それぞれの人が所属するチームが与えられる。
また、誰が誰にボールを当てたかという情報も与えられる。


AがBにボールを当てたとき、AとBが違うチームならAに1点、Bに-1点が加わる。
AとBが同じチームなら、Aに-1点が加えられ、Bの点数は変化しない。
チームの得点は、チームのメンバー全員の得点の和である。


それぞれのチームの得点表を指定された形式で出力せよ。
チームは得点の多い順に(タイならアルファベット順に)、
チーム内のメンバーも得点の多い順に(タイならアルファベット順に)
並べて出力せよ。

制約条件

n≦50
ボールの情報≦50

方針

定義にしたがって実装する。
めんどい。

ソースコード

struct team{
  string name;
  vector<pair<int,string> > mem;
  int sc;
  bool operator<(const team &o)const{
    if(sc!=o.sc)return sc>o.sc;
    return name<o.name;
  }
};

class Paintball {
  public:
  vector <string> getLeaderboard(vector <string> players, vector <string> messages) {
    vector<team> t;
    rep(i,players.size()){
      stringstream ss(players[i]);
      team tmp;
      string tm, nm; ss>>nm>>tm;
      rep(j,t.size())if(t[j].name==tm){
        t[j].mem.pb(mp(0,nm));
        goto NEXT;
      }
      tmp.name=tm;
      tmp.mem.pb(mp(0,nm));
      t.pb(tmp);
      NEXT:;
    }
    rep(i,messages.size()){
      stringstream ss(messages[i]);
      string a,b,c; ss>>a>>b>>c;
      rep(i,t.size())rep(j,t[i].mem.size()){
        if(t[i].mem[j].second==a){
          t[i].mem[j].first--;
          rep(k,t[i].mem.size())if(t[i].mem[k].second==c)
            t[i].mem[j].first+=2, t[i].mem[k].first--;
        }
        if(t[i].mem[j].second==c)t[i].mem[j].first++;
      }
    }
    rep(i,t.size()){
      t[i].sc=0;
      rep(j,t[i].mem.size())t[i].sc-=t[i].mem[j].first;
      sort(all(t[i].mem));
    }
    sort(all(t));
    vs ans;
    rep(i,t.size()){
      char buf[100];
      sprintf(buf,"%s %d",t[i].name.c_str(),t[i].sc);
      ans.pb(buf);
      rep(j,t[i].mem.size()){
        sprintf(buf,"  %s %d",t[i].mem[j].second.c_str(), -t[i].mem[j].first);
        ans.pb(buf);
      }
    }
    return ans;
  }
};