总有一个超时的。
#include <string>
#include <cstdio>
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
struct inandout{
string intime,outtime,parktime;
void compute(){
string shh(intime,0,2),smm(intime,3,2),sss(intime,6,2);
string thh(outtime,0,2),tmm(outtime,3,2),tss(outtime,6,2);
int s=stoi(shh)*60*60+stoi(smm)*60+stoi(sss),t=stoi(thh)*60*60+stoi(tmm)*60+stoi(tss);
int lag=t-s,tt[3];
for(int i=0;i<3;++i){
tt[i]=lag%60;
lag/=60;
}
char tmpt[8];
sprintf(tmpt,"%02d:%02d:%02d",tt[2],tt[1],tt[0]);
parktime.assign(tmpt,tmpt+9);
}
void in(string &a){
intime=a;
}
void out(string &b){
outtime=b;
}
};
struct record{
string plate,time,move;
bool flag=true;
record()=default;
record(const string &a,const string &b,const string &c){
plate=a,time=b,move=c;
}
};
bool cmp_time(const record &a,const record &b){
if(a.time!=b.time)return a.time>b.time;
return a.plate<b.plate;
}
bool cmp_plate(const record &a,const record &b){
if(a.plate!=b.plate)return a.plate<b.plate;
return a.time<b.time;
}
vector<record> rec;
map<string,string> cars;
vector<string> result;
set<string> check,parkingcars;
void addup(string &intime,const string &outtime){
string shh(intime,0,2),smm(intime,3,2),sss(intime,6,2);
string thh(outtime,0,2),tmm(outtime,3,2),tss(outtime,6,2);
int s=stoi(shh)*60*60+stoi(smm)*60+stoi(sss),t=stoi(thh)*60*60+stoi(tmm)*60+stoi(tss);
int lag=t+s,tt[3];
for(int i=0;i<3;++i){
tt[i]=lag%60;
lag/=60;
}
char tmpt[9];
sprintf(tmpt,"%02d:%02d:%02d",tt[2],tt[1],tt[0]);
intime.assign(tmpt,tmpt+9);
}
int main(void){
// freopen("in.log","r",stdin);
int n,k;
string maxtime="00:00:00";
scanf("%d%d",&n,&k);
while(n--){
char p[8],ti[9],mo[4];
scanf("%s%s%s",p,ti,mo);
string a(p),b(ti),c(mo);
record tmpr(a,b,c);
rec.push_back(tmpr);
}
sort(rec.begin(),rec.end(),cmp_plate);
for(int i=0;i<rec.size();){
if(i+1<rec.size()){
if(rec[i].plate==rec[i+1].plate&&rec[i].move=="in"&&rec[i+1].move=="out"){
inandout tmp;
tmp.in(rec[i].time),tmp.out(rec[i+1].time);
tmp.compute();
if(!cars.count(rec[i].plate)){
cars[rec[i].plate]=tmp.parktime;
}
else addup(cars[rec[i].plate],tmp.parktime);
if(cars[rec[i].plate]>maxtime){
result.clear();
maxtime=cars[rec[i].plate];
result.push_back(rec[i].plate);
}
else if(cars[rec[i].plate]==maxtime) result.push_back(rec[i].plate);
i+=2;
}
else rec.erase(rec.begin()+i);
}
else rec.erase(rec.begin()+i);
}
sort(rec.begin(),rec.end(),cmp_time);
int carnum=0,i=rec.size()-1;
while(k--){
string now;
cin>>now;
while(i>=0&&rec[i].time<=now){
if(rec[i].move=="in"){
++carnum;
}
else if(rec[i].move=="out"){
--carnum;
}
--i;
}
cout<<carnum<<endl;
}
sort(result.begin(),result.end());
for(string c:result)cout<<c<<" ";
cout<<maxtime<<endl;
return 0;
}