Submission #1332666

#TimeUsernameProblemLanguageResultExecution timeMemory
1332666ayazPo (COCI21_po)C++20
70 / 70
56 ms18400 KiB
#include <bits/stdc++.h>
using namespace std;

#ifdef LOCAL
#include "algos/debug.h"
#else
#define debug(...) 42
#endif

#define all(x) (x).begin(), (x).end()
#define isz(x) (int)x.size()

const int INF = 1e18;
struct SegmentTree {
  vector<int> st, a;
  int n;
  const int empty = INF;
  int merge(int a, int b) {
    return min(a, b);
  }
  void init(int _n, vector<int> A) {
    n = _n;
    st.resize((n<<2)|1);
    a.resize(n + 1);
    for (int i = 1; i <= n; i++) a[i] = A[i];
  }
  void build(int l, int r, int v) {
    if (l == r) {
      st[v] = a[l];
      return;
    }
    int mid = (l + r)>>1;
    build(l, mid, v<<1);
    build(mid + 1, r, v<<1|1);
    st[v] = merge(st[v<<1], st[v<<1|1]);
  }
  int getans(int ql, int qr, int l, int r, int v) {
    if (ql > r || l > qr) return empty;
    if (ql <= l && r <= qr) return st[v];
    int mid = (l + r)>>1;
    return merge(getans(ql, qr, l, mid, v<<1), getans(ql, qr, mid + 1, r, v<<1|1));
  }
  int getans(int l, int r) {
    return getans(l, r, 1, n, 1);
  }
  void update(int l, int r, int pos, int val, int v) {
    if (l > pos || pos > r) return;
    if (l == r) {
      st[v] = val;
      return;
    }
    int mid = (l + r)>>1;
    update(l, mid, pos, val, v<<1);
    update(mid + 1, r, pos, val, v<<1|1);
    st[v] = merge(st[v<<1], st[v<<1|1]);  
  }
  void update(int pos, int val) {
    update(1, n, pos, val, 1);
  }
};
void run(int tc) {
  int n; cin >> n;
  vector<int> a(n + 1);
  map<int, vector<int>> mp;
  map<int, int> comp;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
    mp[a[i]].push_back(i);
  }
  SegmentTree st;
  st.init(n, a);
  st.build(1, n, 1);
  int ans = 0;
  for (auto [x, v] : mp) {
    if (x == 0) continue;
    comp[x] = v.size();
    for (int i = 1; i < v.size(); i++) {
      if (st.getans(v[i - 1], v[i]) >= x) {
        comp[x]--;
      }
    }
    ans += comp[x];
  }
  cout << ans << '\n';
}
signed main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  int t = 1;
  // cin >> t;
  for (int tc = 1; tc <= t; tc++) run(tc);
}

Compilation message (stderr)

Main.cpp:13:17: warning: overflow in conversion from 'double' to 'int' changes value from '1.0e+18' to '2147483647' [-Woverflow]
   13 | const int INF = 1e18;
      |                 ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...