1026. Table Tennis (30)
#include <bits/stdc++.h>
using namespace std;
int tabletime[128],tablecnt[128],viptag[128];
int n,m,vipm;
struct Person
{
int atime;
int stime;
int utime;
bool isvip;
Person(int at,int st,int ut,bool isv):atime(at),stime(st),utime(ut),isvip(isv){}
bool operator<(const Person &a)const
{
return atime>a.atime;
}
};
priority_queue<Person> p,vip;
priority_queue<int,vector<int>,greater<int>> tpq,vtpq;
vector<Person> v,ret;
bool cmpa(const Person &a,const Person &b)
{
return a.atime<b.atime;
}
bool cmpb(const Person &a,const Person &b)
{
return a.stime<b.stime;
};
int main(int argc, char const *argv[])
{
scanf("%d",&n);
for(int i=0;i<n;++i)
{
int hh,mm,ss,p,isvip,time;
scanf("%d:%d:%d %d %d",&hh,&mm,&ss,&p,&isvip);
time=hh*3600+mm*60+ss;
if(p>120)p=120;
v.push_back(Person(time,time,p*60,isvip));
}
sort(v.begin(),v.end(),cmpa);
scanf("%d %d",&m,&vipm);
while(vipm--)
{
int x;
scanf("%d",&x);
viptag[x]=1;
}
for(int i=1;i<=m;++i)
tabletime[i]=8*3600;
int i=0,curtime=8*3600;
while(true)
{
if(i==n&&p.empty()&&vip.empty())break;
if(curtime>=21*3600)break;
while(i<n&&curtime>=v[i].atime)
{
if(v[i].isvip) vip.push(v[i]);
else p.push(v[i]);
++i;
}
for(int k=1;k<=m;++k)
{
if(tabletime[k]<=curtime)
{
if(viptag[k]) vtpq.push(k);
else tpq.push(k);
}
}
while(!vip.empty()&&!vtpq.empty())
{
Person pi=vip.top();
int ti=vtpq.top();
pi.stime=curtime;
ret.push_back(pi);
tabletime[ti]=curtime+pi.utime;
tablecnt[ti]++;
vip.pop();
vtpq.pop();
}
while(!vip.empty())
{
p.push(vip.top());
vip.pop();
}
while(!vtpq.empty())
{
tpq.push(vtpq.top());
vtpq.pop();
}
while(!p.empty()&&!tpq.empty())
{
Person pi=p.top();
int ti=tpq.top();
pi.stime=curtime;
ret.push_back(pi);
tabletime[ti]=curtime+pi.utime;
tablecnt[ti]++;
p.pop();
tpq.pop();
}
if(p.empty())
{
curtime=v[i].atime;
while(!tpq.empty())
tpq.pop();
}
else
{
int mintime=24*3600+1;
for(int j=1;j<=m;++j)
mintime=min(mintime,tabletime[j]);
curtime=mintime;
priority_queue<Person> temp;
while(!p.empty())
{
Person x=p.top();
if(x.isvip) vip.push(x);
else temp.push(x);
p.pop();
}
p=temp;
}
}
sort(ret.begin(),ret.end(),cmpb);
for(auto x:ret)
{
int wt=(x.stime-x.atime+30)/60;
printf("%02d:%02d:%02d %02d:%02d:%02d %d\n",x.atime/3600,x.atime/60%60,x.atime%60,x.stime/3600,x.stime/60%60,x.stime%60,wt);
}
for(int j=1;j<=m;++j)
j==m?cout<<tablecnt[j]:cout<<tablecnt[j]<<" ";
return 0;
}