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
| #include <cstdio> #include <algorithm> #include <queue>
using namespace std;
struct Point { trueint pid,st,last,rank;
truePoint(int pid=0,int st=0,int last=0,int rank=0):pid(pid),st(st),last(last),rank(rank) {}
truevoid Print(int t) { truetrueprintf("%d %d\n",pid,t); true}
trueconst bool operator < (const Point& tmp)const{ truetruereturn rank<tmp.rank || (rank==tmp.rank && st>tmp.st); true} };
priority_queue<Point> q;
int main() { trueint a,b,c,d; trueint t = 0; truewhile (scanf("%d%d%d%d",&a,&b,&c,&d)!=EOF) true{ truetruewhile ((!q.empty()) && q.top().last + t <= b) truetrue{ truetruetruePoint p = q.top(); truetruetruet += p.last; truetruetruep.Print(t); truetruetrueq.pop(); truetrue} truetrueif (!q.empty()) truetrue{ truetruetruePoint p = q.top(); q.pop(); truetruetruep.last -= b - t; truetruetrueq.push(p); truetrue} truetruet = b;
truetrueq.push(Point(a,b,c,d)); true}
truewhile (!q.empty()) true{ truetruePoint p = q.top(); truetruet += p.last; truetruep.Print(t); truetrue truetrueq.pop(); true} }
|