题意:有一些车的停放记录,给出K个询问时间,每个询问查询当前时刻有多少车停放,停放记录只有相邻两个进出记录有效,最后输出停放时间最长的车以及停放时间。
思路:先把停放记录排序,选出相邻的合法记录,遍历一遍即可得出最长的停放时间及车辆,询问按照从小到大,所以也只要遍历一遍就能得到。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <map>
#include <climits>
#include <vector>
#include <set>
using namespace std;
const int MAX_N = 10100;
const int MAX_Q = 80100;
int toI(char s[]) {
int h = (s[0]-'0')*10+(s[1]-'0');
int m = (s[3]-'0')*10+(s[4]-'0');
int t = (s[6]-'0')*10+(s[7]-'0');
return (h*60*60)+m*60+t;
}
void toS(int q) {
int t = q % 60; q /= 60;
int m = q % 60; q /= 60;
int h = q;
printf("%02d:%02d:%02d", h, m, t);
}
struct Rec {
char id[10];
int tim;
bool in;
bool operator < (const Rec& rec) const {
return tim < rec.tim;
}
}rec[MAX_N], tmp[MAX_N];
int len = 0;
int N, K;
char tim[10], in[5];
map<string, int> inT;
map<string, int> ti;
int query[MAX_Q];
int ans[MAX_Q];
vector<string> ids;
int maxT;
int main() {
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
scanf("%d %d", &N, &K);
for (int i = 0; i < N; i++) {
scanf("%s %s %s", rec[i].id, tim, in);
rec[i].tim = toI(tim);
rec[i].in = (in[0]=='i'?true:false);
}
sort(rec, rec+N);
for (int i = 0; i < K; i++) {
scanf("%s", tim);
query[i] = toI(tim);
}
query[K] = INT_MAX;
int ind = 0, last;
for (int i = 0; i < N; i++) {
if (rec[i].in) {
inT[rec[i].id] = rec[i].tim;
} else {
if (inT.count(rec[i].id)) {
ti[rec[i].id] += rec[i].tim - inT[rec[i].id];
tmp[len].tim = inT[rec[i].id]; tmp[len].in = 1; len++;
tmp[len].tim = rec[i].tim; tmp[len].in = 0; len++;
inT.erase(rec[i].id);
}
}
}
sort(tmp, tmp + len);
int ct = 0;
for (int i = 0; i < len; i++) {
if (tmp[i].in) {
ct++;
} else {
ct--;
}
while (ind < K && tmp[i].tim > query[ind]) {
ans[ind] = ct + (tmp[i].in?-1:1); ind++;
}
}
while (ind < K) {
ans[ind] = ct; ind++;
}
maxT = 0;
for (auto it = ti.begin(); it != ti.end(); it++) {
if (it->second > maxT) {
maxT = it->second;
ids.clear(); ids.push_back(it->first);
} else if (it->second == maxT) {
ids.push_back(it->first);
}
}
sort(ids.begin(), ids.end());
for (int i = 0; i < K; i++) {
printf("%d\n", ans[i]);
}
for (int i = 0; i < ids.size(); i++) {
printf("%s ", ids[i].c_str());
}
toS(maxT); printf("\n");
return 0;
}