Advertisement
Guest User

Untitled

a guest
May 20th, 2019
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.83 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <vector>
  4. #include <algorithm>
  5. #include <queue>
  6.  
  7. using namespace std;
  8.  
  9. struct Worker {
  10.     long long time;
  11.     int level;
  12.     long long answer;
  13. };
  14.  
  15. int main()
  16. {
  17.  
  18.     int n_people, n_levels;
  19.     scanf("%d %d", &n_people, &n_levels);
  20.     vector<Worker> workers(n_people);
  21.  
  22.     for(int i = 0; i < n_people; i++)
  23.     {
  24.         scanf("%d %d", &workers[i].time, &workers[i].level);
  25.         workers[i].answer = -1;
  26.     }
  27.     auto greater_level = [](const Worker * const left, const Worker * const right) {
  28.         return left->level > right->level;
  29.     };
  30.     priority_queue<Worker*, vector<Worker*>, decltype(greater_level)> waiting(greater_level);
  31.     int index = 0; //unhandled
  32.     long long current_time = 0;
  33.  
  34.     for(int i = 0; i < n_people; i++)
  35.     {
  36.         if(workers[i].answer != -1)
  37.         {
  38.             continue;
  39.         }
  40.         long long start_time = max(current_time, workers[i].time);
  41.         int top_level = workers[i].level;
  42.         long long top_time = start_time + (top_level - 1);
  43.         long long end_time = top_time + (top_level - 1);
  44.         while (!waiting.empty() && waiting.top()->level <= top_level)
  45.         {
  46.             waiting.top()->answer = end_time;
  47.             waiting.pop();
  48.         }
  49.         while(index < n_people && workers[index].time <= end_time)
  50.         {
  51.             Worker &current = workers[index];
  52.             if(current.level <= top_level && current.level + current.time <= top_level + top_time)
  53.             {
  54.                 current.answer = end_time;
  55.             } else
  56.             {
  57.                 waiting.push(&current);
  58.             }
  59.             index++;
  60.         }
  61.         current_time = end_time;
  62.     }
  63.  
  64.     for(int i = 0; i < n_people; i++)
  65.     {
  66.         printf("%lld\n", workers[i].answer);
  67.     }
  68.     return 0;
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement