Submission #1343156

#TimeUsernameProblemLanguageResultExecution timeMemory
1343156alan_cZoltan (COCI16_zoltan)C++20
140 / 140
234 ms17528 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;

const int M = 1e9 + 7;

pii combine(const pii &a, const pii &b) {
  if (a.first < b.first)
    return b;
  if (a.first > b.first)
    return a;
  return {a.first, (a.second + b.second) % M};
}

struct Seg {
  int n;
  vector<pii> t;

  Seg(int n_) : n(n_), t(2 * n) {}

  void set(int i, pii v) {
    i += n;
    t[i] = combine(t[i], v);
    while (i /= 2)
      t[i] = combine(t[2 * i], t[2 * i + 1]);
  }

  pii query(int l, int r) {
    pii ret = {0, 1};
    for (l += n, r += n; l < r; l /= 2, r /= 2) {
      if (l % 2)
        ret = combine(ret, t[l++]);
      if (r % 2)
        ret = combine(ret, t[--r]);
    }
    return ret;
  }
};

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int n;
  cin >> n;
  vector<int> a(n);
  map<int, int> cc;
  for (int &i : a) {
    cin >> i;
    cc[i];
  }

  int cnt = 0;
  for (auto &[k, v] : cc)
    v = cnt++;
  for (int &i : a)
    i = cc[i];

  vector<int> p2(n);
  p2[0] = 1;
  for (int i = 1; i < n; i++)
    p2[i] = 2 * p2[i - 1] % M;

  Seg inc(cnt), dec(cnt);
  pii ans = {0, 0};
  for (int i = n - 1; i >= 0; i--) {
    pii qinc = inc.query(a[i] + 1, cnt), qdec = dec.query(0, a[i]);
    qinc.first++, qdec.first++;

    int len = qinc.first + qdec.first - 1;
    ans = combine(
        ans, {len, int((ll)p2[n - len] * qinc.second % M * qdec.second % M)});

    inc.set(a[i], qinc);
    dec.set(a[i], qdec);
  }

  cout << ans.first << ' ' << ans.second << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...