非常NB的题目
#include <bits/stdc++.h>
using namespace std;
#define e(a) exit(a) // 4
#define rep(i, a, n) for(int i=a;i<n;++i)
#define repe(i, a, n) for(int i=a;i<=n;++i)
#define per(i, a, n) for (int i=n-1;i>=a;--i)
#define pere(i, a, n) for (int i=n;i>=a;--i)
#define trav(a, x) for(auto& a:x)
#define travc(a, x) for(auto a:x)
#define mcpy(a, b) memcpy(a,b,sizeof b)
#define mone(x) memset(x,-1,sizeof x)
#define mmax(x) memset(x,0x3f,sizeof x)
#define mmin(x) memset(x,-0x3f,sizeof x)
#define mzero(x) memset(x,0,sizeof x)
#define bg begin()
#define ed end()
#define ft front()
#define bk back()
#define all(x) x.bg,x.ed
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define sz(x) (int)x.size()
#define p(x) cout<<(x)<<endl
#define pp(x) cout<<x.fi<<' '<<x.se<<endl
#define in() freopen("in.txt", "r", stdin)
#define out() freopen("out.txt", "w", stdout)
#define gtime() cout << "time:" << 1.0 * clock() / CLOCKS_PER_SEC << " s." << endl
#define gspace(x) cout << 1.0 * sizeof x / 1024 / 1024 << endl // 29
typedef long long ll; //31
typedef unsigned long long ull;
typedef double db;
typedef vector<int> vi;
typedef pair<int, int> pii;
typedef map<int, int> mii;
typedef unordered_map<int, int> umii;
typedef unordered_set<int> usi; //38
ll mod(ll a, ll b) { return (a % b + b) % b; } // 40
int lb(int x) { return x & -x; }
const int INF = 0x3f3f3f3f; // 52
const int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1}; //53
/////////////////////////////
const int N = 1e4 + 10, M = 110;
struct R {
int comeTime, playTime, serveTime, leaveTime;
bool isVip;
R() : comeTime(0), playTime(0), serveTime(0), leaveTime(0), isVip(false) {} // 初始值
bool operator<(const R &w) const {
return comeTime < w.comeTime;
}
} p[N];
queue<int> q1, q2; // q1是普通队,q2是VIP队
struct T {
int count, serve;
bool isVip;
T() : count(0), serve(-1), isVip(false) {} // 初始值
} t[M];
void print(int t) {
printf("%02d:%02d:%02d ", t / 3600, t / 60 % 60, t % 60);
}
bool cmp(R a, R b) {
if (a.serveTime != b.serveTime) return a.serveTime < b.serveTime;
return a.comeTime < b.comeTime;
}
int main() {
// in();
int n, k, m;
cin >> n;
rep(i, 0, n) {
int hh, mm, ss, playTime;
scanf("%d:%d:%d %d %d", &hh, &mm, &ss, &playTime, &p[i].isVip);
p[i].comeTime = hh * 3600 + mm * 60 + ss;
if (playTime > 120) playTime = 120;
playTime *= 60;
p[i].playTime = playTime;
}
cin >> k >> m;
while (m--) {
int x;
cin >> x;
t[x].isVip = true;
}
sort(p, p + n);
vector<R> res;
int cur = 0;
rep(T, 28800, 75600) {
repe(i, 1, k) {
if (t[i].serve == -1) continue;
int j = t[i].serve;
if (p[j].leaveTime == T) t[i].serve = -1;
}
while (cur < n && p[cur].comeTime <= T) {
q1.push(cur); // 当没有空的vip桌时,vip球员也是普通球员
if (p[cur].isVip) q2.push(cur);
cur++;
}
while (sz(q2) && p[q2.ft].serveTime) q2.pop();
repe(i, 1, k) {
if (!t[i].isVip) continue;
if (t[i].serve != -1)continue;
if (sz(q2)) {
int j = q2.ft;
t[i].serve = j;
t[i].count++;
p[j].serveTime = T;
p[j].leaveTime = T + p[j].playTime;
res.pb(p[j]);
while (sz(q2) && p[q2.ft].serveTime) q2.pop(); // todo
}
}
while (sz(q1) && p[q1.ft].serveTime) q1.pop();
repe(i, 1, k) {
if (t[i].serve != -1)continue;
if (sz(q1)) {
int j = q1.ft;
t[i].serve = j;
t[i].count++;
p[j].serveTime = T;
p[j].leaveTime = T + p[j].playTime;
res.pb(p[j]);
while (sz(q1) && p[q1.ft].serveTime) q1.pop(); // todo
}
}
}
sort(all(res), cmp);
trav(i, res) {
int t1 = i.comeTime, t2 = i.serveTime;
print(t1), print(t2);
p((t2 - t1 + 30) / 60);
}
bool isFirst = true;
repe(i, 1, k) {
if (isFirst) isFirst = false;
else cout << ' ';
cout << t[i].count;
}
}