PloadyFree

Southern Russia Open Championship 2019 G Girland

Aug 3rd, 2019
215
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.75 KB | None | 0 0
  1. #include <cstdio>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. struct Queue {
  7.   int period;
  8.   vector<int> deltas;
  9.   vector<int> array;
  10.   int takenSum;
  11.  
  12.   Queue(vector<int> array) {
  13.     this->array = array;
  14.   }
  15.  
  16.   void init(int start, int period) {
  17.     period *= 2;
  18.     this->position = start;
  19.     this->moddedPosition = 0;
  20.     this->period = period;
  21.     deltas.assign(period, 0);
  22.     for (int i = 0; i < period; i++) deltas[i] = 0;
  23.     this->takenSum = 0;
  24.     for (int i = start, j = 0; i < (int)array.size(); i++, j++) {
  25.       if (i >= 0) {
  26.         deltas[j % period] += array[i];
  27.         if (j % period < period / 2) {
  28.           takenSum += array[i];
  29.         }
  30.       }
  31.     }
  32.   }
  33.  
  34.   int position;
  35.   int moddedPosition;
  36.   void move() {
  37.     takenSum -= deltas[moddedPosition];
  38.     takenSum += deltas[(moddedPosition + period / 2) % period];
  39.     if (position >= 0) deltas[moddedPosition] -= array[position];
  40.     moddedPosition = (moddedPosition + 1) % period;
  41.     position++;
  42.   }
  43. };
  44.  
  45. int main(int argc, char *argv[]) {
  46.   int n, q;
  47.   scanf("%d%d", &n, &q);
  48.   vector<int> a(n);
  49.   for (int i = 0; i < q; i++) {
  50.     int l, r;
  51.     scanf("%d%d", &l, &r);
  52.     for (int j = l; j < r; j++) a[j] = 1;
  53.   }
  54.   int ansMinAtHome = n + 1;
  55.   int ansStart = -1;
  56.   int ansLen = -1;
  57.   Queue q1(a);
  58.   Queue q2(vector<int>(n, 1));
  59.   for (int len = n; len >= 1; len--) {
  60.     q1.init(-2*len, len);
  61.     q2.init(-2*len, len);
  62.     while (q1.position + 1 < n) {
  63.       q1.move();
  64.       q2.move();
  65.       if (q2.takenSum * 2 >= n) {
  66.         if (q1.takenSum <= ansMinAtHome) {
  67.           ansMinAtHome = q1.takenSum;
  68.           ansStart = q1.position;
  69.           ansLen = len;
  70.         }
  71.       }
  72.     }
  73.   }
  74.   printf("%d %d %d", ansMinAtHome, ansLen, ansStart);
  75. }
Advertisement
Add Comment
Please, Sign In to add comment