在这种数据处理复杂并且可能输出较多的情况下
!!!牢记:多次读取,多次输出的地方(循环中),能用scanf和printf就不要用cin和cout
这道题就是典型的换输出方法会导致耗时非常显著变化的例子
最终的耗时非常可观,都控制在100ms以内,远远低于200的限制
使用了多个map来避免每次都对所有记录遍历,读取数据的时候就完成数据处理
写的时候为了每种情况写得更加直观,设置的类型比较多
#include<iostream>
#include<vector>
#include<unordered_map>
#include<algorithm>
using namespace std;
int N,M;
struct node{
string id;
int score;
};
struct node2{
int num2;
int total;
};
struct node3{
string site;
int num3;
};
bool cmp1(const node a,const node b){
if(a.score==b.score){
return a.id<b.id;
}else{
return a.score>b.score;
}
}
bool cmp2(const node3 a,const node3 b){
if(a.num3==b.num3){
return a.site<b.site;
}else{
return a.num3>b.num3;
}
}
vector<node> T,A,B;
unordered_map<string,node2> two;
unordered_map<string,unordered_map<string,int>> three;
int main(){
cin>>N>>M;
for(int i=0;i<N;i++){
string a;
int b;
cin>>a>>b;
if(a[0]=='T'){
T.push_back(node{a,b});
}else if(a[0]=='A'){
A.push_back(node{a,b});
}else{
B.push_back(node{a,b});
}
string site=a.substr(1,3);
two[site].num2++;
two[site].total+=b;
string date=a.substr(4,6);
three[date][site]++;
}
sort(T.begin(),T.end(),cmp1);
sort(A.begin(),A.end(),cmp1);
sort(B.begin(),B.end(),cmp1);
for(int i=0;i<M;i++){
int q;
string s;
cin>>q>>s;
printf("Case %d: %d %s\n", i+1, q, s.c_str());
if(q==1){
if(s=="T"){
if(T.size()==0){
printf("NA\n");
continue;
}
for(auto it:T){
printf("%s %d\n",it.id.c_str(),it.score);
}
}else if(s=="A"){
if(A.size()==0){
printf("NA\n");
continue;
}
for(auto it:A){
printf("%s %d\n",it.id.c_str(),it.score);
}
}else{
if(B.size()==0){
printf("NA\n");
continue;
}
for(auto it:B){
printf("%s %d\n",it.id.c_str(),it.score);
}
}
}else if(q==2){
if(two.find(s)!=two.end()){
printf("%d %d\n",two[s].num2,two[s].total);
}else{
printf("NA\n");
}
}else{
if(three.find(s)!=three.end()){
vector<node3> v;
for(auto it=three[s].begin();it!=three[s].end();it++){
v.push_back(node3{it->first,it->second});
}
sort(v.begin(),v.end(),cmp2);
for(auto it:v){
printf("%s %d\n",it.site.c_str(),it.num3);
}
}else{
printf("NA\n");
}
}
}
return 0;
}