1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
| #include <cstdio> #include <cstring> #include <algorithm> using namespace std;
const int N = 1e4 + 10; const int K = 8e4 + 10; struct Car { char plate[8]; int curTime; int endTime; int parkTime; char status[5]; } cars[N],ans[N],res[N]; int n, m, query[K]; int k=0; int changeTime(int h, int m, int s) { return (h * 60 + m) * 60 + s; }
void TimeTo24(int cur, int &h, int &m, int &s) { s = cur % 60; cur /= 60; m = cur % 60; h = cur / 60; }
bool cmpCur(const Car &a, const Car &b) { if (strcmp(a.plate, b.plate) != 0) return strcmp(a.plate, b.plate) < 0; else return a.curTime < b.curTime; } bool cmpPark(const Car &a, const Car &b){ if (a.parkTime!=b.parkTime) return a.parkTime>b.parkTime; else return strcmp(a.plate,b.plate)<0; } bool cmpAns(const Car &a, const Car &b){ return a.curTime<b.curTime; } int binarySearch(int x){ int l=0,r=k,mid; while(l<r){ mid=(l+r)/2; if(ans[mid].curTime>x){ r=mid; }else{ l=mid+1; } } return l; }
int main() { scanf("%d%d", &n, &m); int hh, mm, ss; for (int i = 0; i < n; i++) { scanf("%s %d:%d:%d %s", &cars[i].plate, &hh, &mm, &ss, &cars[i].status); cars[i].curTime = changeTime(hh, mm, ss); } for (int i = 0; i < m; i++) { scanf("%d:%d:%d", &hh, &mm, &ss); query[i] = changeTime(hh, mm, ss); } sort(cars, cars + n, cmpCur);
for (int i = 0; i < n ; i++) { if (strcmp(cars[i].plate, cars[i + 1].plate) == 0 && strcmp(cars[i].status, "in") == 0 && strcmp(cars[i + 1].status, "out")==0) { ans[k]=cars[i]; ans[k].endTime=cars[i+1].curTime; ans[k].parkTime=cars[i+1].curTime-cars[i].curTime; i++; k++; } } sort(ans,ans+k,cmpAns);
for(int i=0;i<m;i++){ int ct=0; int p=binarySearch(query[i]);
for(int j=p-1;j>=0;j--){ if(ans[j].endTime>query[i]){ ct++; } } printf("%d\n",ct); }
sort(ans, ans + k, cmpCur); char id[8]="xxx"; int t=0; for(int i=0;i<k;i++){ if(strcmp(ans[i].plate,id)!=0){ res[t++]=ans[i]; strcpy(id,ans[i].plate); }else{ res[t-1].parkTime+=ans[i].parkTime; } } sort(res,res+t,cmpPark); if(res[0].parkTime!=0) printf("%s",res[0].plate); for(int i=1;i<t;i++){ if(res[i].parkTime==res[0].parkTime){ printf(" %s",res[i].plate); }else break; } TimeTo24(res[0].parkTime,hh,mm,ss); printf(" %02d:%02d:%02d",hh,mm,ss); return 0; }
|