qwerty787788

DGCJ C++

Aug 6th, 2016
403
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.52 KB | None | 0 0
  1. #include <message.h>
  2. #include <cassert>
  3. #include <cstdio>
  4. #include <algorithm>
  5. #include <iostream>
  6. #include "gas_stations.h"
  7.  
  8. using namespace std;
  9.  
  10.  
  11. #define N 5100000
  12. #define M (2 * N)
  13.  
  14. int myVals[N];
  15. int stackVal[M];
  16. int stackPos[M];
  17. int stackStart = 0, stackEnd = 0;
  18.  
  19. #define sub(x) (x == 0 ? (M - 1) : (x - 1))
  20.  
  21. void addToStack(int pos, int value) {
  22. //  fprintf(stderr, "add to stack (%d, %d)\n", pos, value);
  23.   while (stackEnd != stackStart && stackVal[sub(stackEnd)] > value) {
  24.     stackEnd--;
  25.     if (stackEnd == -1) {
  26.       stackEnd += M;
  27.     }
  28.   }
  29.   stackVal[stackEnd] = value;
  30.   stackPos[stackEnd] = pos;
  31.   stackEnd++;
  32.   if (stackEnd == M) {
  33.     stackEnd -= M;
  34.   }
  35. }
  36.  
  37. void removeFromStack(int pos) {
  38. //  fprintf(stderr, "remove from stack pos = %d\n", pos);
  39.   if (stackPos[stackStart] == pos) {
  40.     stackStart++;
  41.     if (stackStart == M) {
  42.       stackStart = 0;
  43.     }
  44.   }
  45. }
  46.  
  47. int main() {
  48.   int myId = MyNodeId();
  49.   int tankSize = (int) GetTankSize();
  50.   int n = (int) GetNumKms();
  51.   int nodes = NumberOfNodes();
  52.   int len = 1 + (n - 1) / nodes;
  53.   int left = min(n, len * myId);
  54.   int right = min(n, len * (myId + 1));
  55.   int myMin = (int) 2e9;
  56.   for (int pos = left; pos < right; pos++) {
  57.     myVals[pos - left] = (int) GetGasPrice(pos);
  58.     myMin = min(myVals[pos - left], myMin);
  59.   }
  60.   for (int node = 0; node < nodes; node++) {
  61.     PutInt(node, myMin);
  62.     Send(node);
  63.   }
  64.   int allFr = max(0, (right - 1 - tankSize + 1));
  65.   int allTo = left;
  66.   int myRes = (int) 2e9;
  67.   int ok = 2e9;
  68.   for (int node = 0; node < nodes; node++) {
  69.     Receive(node);
  70.     int curMin = GetInt(node);
  71.     int le = min(n, len * (node));
  72.     int ri = min(n, len * (node + 1));
  73.     if (le >= allFr && ri <= allTo) {
  74.       ok = min(ok, le);
  75.       myRes = min(myRes, curMin);
  76.     }
  77.   }
  78.   long long sum = 0LL;
  79.   int start = max(0, left - tankSize + 1);
  80.   for (int cur = start; cur < left && cur < ok; cur++) {
  81.     addToStack(cur, (int) GetGasPrice(cur));
  82.   }
  83.   for (int pos = left; pos < right; pos++) {
  84. //    fprintf(stderr, "check pos %d\n", pos);
  85.     addToStack(pos, myVals[pos - left]);
  86.     removeFromStack(pos - tankSize);
  87. //    fprintf(stderr, "my res = %d\n", myRes);
  88. //    fprintf(stderr, "stack value = %d\n", stackVal[stackStart]);
  89.     sum += min(myRes, stackVal[stackStart]);
  90.   }
  91.   PutLL(0, sum);
  92.   Send(0);
  93.   if (myId == 0) {
  94.     sum = 0;
  95.     for (int node = 0; node < nodes; node++) {
  96.       Receive(node);
  97.       sum += GetLL(node);
  98.     }
  99.     cout << sum << endl;
  100.   }
  101.   return 0;
  102. }
Advertisement
Add Comment
Please, Sign In to add comment