題目
思路
注意兩點:
- 要用printf代替cout否則最後兩個測試點超時
- 要三個查詢要分開存儲,不能存儲在一個大塊,活用unordered_map
代碼
#include <iostream>
#include <vector>
#include <unordered_map>
#include <string>
#include <algorithm>
#include <string.h>
using namespace std;
vector<pair<string, int>> tmp[3];
pair<int,int> mark[1000];
unordered_map<int,unordered_map<int,int>> mmm;
bool cmp(const pair<string, int>& a, const pair<string, int>& b) {
return a.second != b.second ? a.second > b.second : a.first < b.first;
}
bool cmp1(const pair<int, int>& a, const pair<int, int>& b) {
return a.second != b.second ? a.second > b.second : a.first < b.first;
}
int main()
{
int n, qn;
cin >> n >> qn;
for (int i = 0; i < 1000; ++i) {
mark[i].first = mark[i].second = 0;
}
for (int i = 0; i < n; ++i) {
string ID;
int score;
cin >> ID >> score;
int site = stoi(ID.substr(1, 3));
int date = stoi(ID.substr(4, 6));
if (ID[0] == 'A')
tmp[0].emplace_back(pair<string, int>(ID, score));
else if (ID[1] == 'B')
tmp[1].emplace_back(pair<string, int>(ID, score));
else
tmp[2].emplace_back(pair<string, int>(ID, score));
mark[site].first++;
mark[site].second += score;
auto p = mmm.find(date);
if (mmm.count(date)) {
if (p->second.count(site))
p->second[site]++;
else
mmm[date].emplace(make_pair(site, 1));
}
else
mmm[date].emplace(make_pair(site, 1));
}
sort(tmp[0].begin(), tmp[0].end(), cmp);
sort(tmp[1].begin(), tmp[1].end(), cmp);
sort(tmp[2].begin(), tmp[2].end(), cmp);
for (int i = 1; i <= qn; ++i) {
int qnum;
string qqs;
cin >> qnum >> qqs;
printf("Case %d: %d %s\n", i, qnum, qqs.c_str());
if (qnum == 1) {
char qq = qqs[0];
int _index;
if (qq == 'A')
_index = 0;
else if (qq == 'B')
_index = 1;
else
_index = 2;
if (tmp[_index].empty()) {
printf("NA\n");
continue;
}
for (auto& p : tmp[_index])
printf("%s %d\n", p.first.c_str(), p.second);
}
else if (qnum == 2) {
int qq = stoi(qqs);
if (mark[qq].first == 0) {
printf("NA\n");
continue;
}
printf("%d %d\n", mark[qq].first, mark[qq].second);
}
else{
int qq = stoi(qqs);
auto p = mmm. find(qq);
if (p == mmm.end()) {
printf("NA\n");
continue;
}
vector<pair<int, int>> tt(p->second.begin(),p->second.end());
sort(tt.begin(), tt.end(), cmp1);
for (auto& p : tt)
printf("%d %d\n", p.first, p.second);
}
}
return 0;
}