niyaznigmatullin

Untitled

Apr 4th, 2017
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.59 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. int const N = 1234567;
  6. int const T = 1000000001;
  7.  
  8. pair<int, int> st[N];
  9. int a[N];
  10.  
  11. struct node {
  12.   node *left;
  13.   node *right;
  14.   int value;
  15.  
  16.   node() : left(0), right(0), value(0) {}
  17. };
  18.  
  19. void clear(node *v) {
  20.   if (!v) return;
  21.   clear(v->left);
  22.   clear(v->right);
  23.   delete v;
  24. }
  25.  
  26. int inc(node *v, int left, int right, int x, int value) {
  27.   if (left >= right - 1) {
  28.     v->value++;
  29.     if (v->value == value) {
  30.       v->value = 0;
  31.       return false;
  32.     }
  33.     return true;
  34.   }
  35.   int mid = (left + right) >> 1;
  36.   if (x < mid) {
  37.     if (!v->left) {
  38.       v->left = new node();
  39.     }
  40.     clear(v->right);
  41.     v->right = 0;
  42.     return inc(v->left, left, mid, x, value);
  43.   } else {
  44.     if (!v->right) {
  45.       v->right = new node();
  46.     }
  47.     return inc(v->right, mid, right, x, value);
  48.   }
  49. }
  50.  
  51. int main() {
  52.   int n;
  53.   scanf("%d", &n);
  54.   for (int i = 0; i < n; i++) scanf("%d", a + i);
  55.   bool is_one = true;
  56.   for (int i = 1; i < n; i++) is_one &= a[i] > a[i - 1];
  57.   if (is_one) {
  58.     puts("1");
  59.     return 0;
  60.   }
  61.   int l = 1;
  62.   int r = n;
  63.   while (l < r - 1) {
  64.     int mid = (l + r) >> 1;
  65.     bool bad = false;
  66.     node *root = new node();
  67.     for (int i = 1; i < n; i++) {
  68.       if (a[i] <= a[i - 1]) {
  69.         int x = a[i] - 1;
  70.         while (x >= 0 && !inc(root, 0, T, x, mid)) {
  71.           --x;
  72.         }
  73.         if (x < 0) {
  74.           bad = true;
  75.           break;
  76.         }
  77.       }
  78.     }
  79.     clear(root);
  80.     if (bad) {
  81.       l = mid;
  82.     } else {
  83.       r = mid;
  84.     }
  85.   }
  86.   printf("%d\n", r);
  87. }
Advertisement
Add Comment
Please, Sign In to add comment