Advertisement
Guest User

O

a guest
Jun 21st, 2018
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.50 KB | None | 0 0
  1. #pragma GCC optimize ("O3")
  2. #include <bits/stdc++.h>
  3. #define pb push_back
  4. #define pf push_front
  5. #define all(a) (a).begin(), (a).end()
  6. #define heap priority_queue
  7. using namespace std;
  8. typedef long long ll;
  9. typedef unsigned long long ull;
  10. typedef long double ld;
  11. typedef pair<ll, ll> pll;
  12. const ll inf = numeric_limits<ll>::max() / 2;
  13. const ld eps = 1e-9;
  14.  
  15. typedef tuple <ll, ll, ll> triple;
  16.  
  17. ll N;
  18. vector<ll> as;
  19. vector<ll> pref, suf;
  20. vector<ll> center;
  21. vector<triple> ts;
  22.  
  23. bool comp(triple a, triple b) {
  24.     if (get<0>(a) != get<0>(b)) {
  25.         return a < b;
  26.     }
  27.     return get<1>(a) > get<1>(b) && get<2>(a) < get<2>(b);
  28. }
  29.  
  30. pll solve() {
  31.     pref.assign(N + 1, 0);
  32.     suf.assign(N + 2, 0);
  33.     for (ll i = 1; i <= N; i++) {
  34.         pref[i] = pref[i - 1] + (as[i] == i);
  35.     }
  36.     for (ll i = N; i >= 1; i--) {
  37.         suf[i] = suf[i + 1] + (as[i] == i);
  38.     }
  39.     for (ll i = 1; i <= N; i++) {
  40.         ll p = as[i] + i;
  41.         ts.pb({ p, min(as[i], i), max(as[i], i) });
  42.     }
  43.     ll ans = 0;
  44.     ll ansi = -1, ansj = -1;
  45.     sort(all(ts), comp);
  46.     center.assign(2 * N + 2, 0);
  47.     for (triple t : ts) {
  48.         ll c, l, r;
  49.         tie(c, l, r) = t;
  50.         ll cnt = 1 + l != r;
  51.         center[c] += cnt;
  52.         ll a = center[c] + pref[l-1] + suf[r+1];
  53.         if (a > ans) {
  54.             ans = a;
  55.             ansi = l, ansj = r;
  56.         }
  57.     }
  58.     return { ansi, ansj };
  59. }
  60.  
  61. int main() {
  62.     ios_base::sync_with_stdio(0); cin.tie(0);
  63.     cin >> N;
  64.     as.resize(N + 1);
  65.     for (ll i = 1; i <= N; i++) {
  66.         cin >> as[i];
  67.     }
  68.     pll p = solve();
  69.     cout << as[p.first] << " " << as[p.second] << endl;
  70.     return 0;
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement