Advertisement
Guest User

Untitled

a guest
Apr 25th, 2018
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.70 KB | None | 0 0
  1.  #include <bits/stdc++.h>
  2.  #define prev prev_i_love_std
  3.  #define rank rank_i_love_std
  4.  using namespace std;
  5.  
  6.  const int MAXN = 500010;
  7.  
  8.  vector<int> a;
  9.  vector<int> prev;
  10.  int p[MAXN];
  11.  int rank[MAXN];
  12.  double add[MAXN];;
  13.  int left1[MAXN];
  14.  int right1[MAXN];
  15.  int n;
  16.  
  17.  inline int get(int a) {
  18.    int b = a;
  19.    while (a != p[a]) a = p[a];
  20.    while (b != a) {
  21.      int tmp = p[b];
  22.      p[b] = a;
  23.      b = tmp;
  24.    }
  25.    return b;
  26.  }
  27.  
  28.  void join(int a, int b) {
  29.      a = get(a);
  30.      b = get(b);
  31.      if (rank[a] < rank[b]) swap(a, b);
  32.      p[b] = a;
  33.      add[a] += add[b];  
  34.      right1[a] = max(right1[a], right1[b]);
  35.      left1[a] = min(left1[a], left1[b]);
  36.      if (rank[a] == rank[b])
  37.      rank[a]++;
  38.  }
  39.  
  40.  bool check(double x) {
  41.     for (int i = 0; i <= n; i++)
  42.         add[i] = rank[i] = 0;
  43.     for (int i = 0; i <= n; i++) p[i] = left1[i] = right1[i] = i;
  44.     double sum = 0;
  45.     double total = 0;
  46.     for (int i = 0; i < n; i++){
  47.        sum += x - 1;
  48.        add[i + 1] = x - 1;
  49.        total += x - 1;
  50.        if (prev[i] != -1) {
  51.      int tmp = get(right1[get(prev[i])] + 1);
  52.      add[tmp] += 1;
  53.      total += 1;
  54.      sum += 1;
  55.      while (add[tmp] >= 0 && left1[tmp]) {
  56.        assert(p[tmp] == tmp);
  57.        if (right1[tmp] == i + 1) return true;
  58.        add[get(right1[tmp]+1)] += add[tmp];
  59.        add[tmp] = 0;
  60.        join(tmp, left1[tmp] - 1);
  61.        tmp = get(right1[get(tmp)] + 1);
  62.      }
  63.        }
  64.     }
  65.     return false;
  66.  }
  67.  
  68.  int main(){
  69.    clock_t start = clock();
  70.  ios_base::sync_with_stdio(0); cin.tie(0);
  71.   cin >> n;// scanf("%d",&n);
  72.    a = vector<int>(n);
  73.    for (int i = 0; i < n; i++)  {
  74.       int x;    cin >> x; a[i] = x; // scanf("%d", &x);
  75.  }
  76.    int c = 0;
  77.    {
  78.      prev = vector<int>(n);
  79.      map<int, int> _prev;
  80.      for (int i = 0; i < n; i++) {
  81.        auto it = _prev.find(a[i]);
  82.        if (it != _prev.end()) {
  83.            prev[i] = _prev[a[i]];
  84.            _prev[a[i]] = i;
  85.            a[i] = a[prev[i]];
  86.        } else {
  87.            prev[i] = -1;
  88.            _prev[a[i]] = i;
  89.            a[i] = c++;
  90.        }
  91.      }
  92.    }
  93.  
  94.  
  95.    double l = 0, r = 1;
  96.    for (int i = 0; i < 40; i++) {
  97.      double x = (l + r) / 2;
  98.      if (check(x))
  99.      r = x;
  100.      else
  101.      l = x;
  102.    }
  103.  
  104.    fprintf(stderr, "%.10f %.10f\n", l, r);
  105.    int p, q;
  106.    p = q = -1;
  107.    for (int i = 1; i <= n; i++) {
  108.      double ll = l * i;
  109.      double rr = r * i;
  110.      double res = round(ll);
  111.      if (ll <= res && res <= rr) {
  112.      if (p == -1) p = res, q = i;
  113.      assert(q * (long long)res - p * (long long) i == 0);
  114.      }
  115.    }
  116.  
  117.    printf("%d %d\n", p, q);
  118.    fprintf(stderr, "time = %.10f\n", (double)(clock() - start) / CLOCKS_PER_SEC);
  119.    return 0;
  120.  }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement