Submission #1036250

#TimeUsernameProblemLanguageResultExecution timeMemory
1036250ind1vPilot (NOI19_pilot)C++11
100 / 100
429 ms53328 KiB
#include <bits/stdc++.h>

using namespace std;

const int N = 1e6 + 5;

struct dsu {
  int lab[N];
  int cnt[N];
  bool on[N];
  long long cur;
  
  dsu() {
    memset(lab, -1, sizeof(lab));
    fill(cnt, cnt + N, 1);
    cur = 0;
  }
  
  int find(int u) {
    return lab[u] < 0 ? u : lab[u] = find(lab[u]);
  }
  
  bool merge(int u, int v) {
    if ((u = find(u)) == (v = find(v))) {
      return false;
    }
    if (lab[u] > lab[v]) {
      swap(u, v);
    }
    lab[u] += lab[v];
    lab[v] = u;
    cur -= 1LL * cnt[u] * (cnt[u] + 1) / 2;
    cur -= 1LL * cnt[v] * (cnt[v] + 1) / 2;
    cnt[u] += cnt[v];
    cur += 1LL * cnt[u] * (cnt[u] + 1) / 2;
    return true;
  }
};

int n, q;
int h[N], y[N];
int ord_h[N], ord_y[N];
long long ans[N];
dsu g;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> n >> q;
  for (int i = 1; i <= n; i++) {
    cin >> h[i];
  }
  for (int i = 1; i <= q; i++) {
    cin >> y[i];
  }
  iota(ord_h + 1, ord_h + n + 1, 1);
  sort(ord_h + 1, ord_h + n + 1, [](int u, int v) -> bool {
    return h[u] < h[v];
  });
  iota(ord_y + 1, ord_y + q + 1, 1);
  sort(ord_y + 1, ord_y + q + 1, [](int u, int v) -> bool {
    return y[u] < y[v];
  });
  for (int i = 1, j = 1; i <= q; i++) {
    while (j <= n && h[ord_h[j]] <= y[ord_y[i]]) {
      g.on[ord_h[j]] = true;
      g.cur++;
      if (ord_h[j] - 1 >= 1 && g.on[ord_h[j] - 1]) {
        g.merge(ord_h[j], ord_h[j] - 1);
      }
      if (ord_h[j] + 1 <= n && g.on[ord_h[j] + 1]) {
        g.merge(ord_h[j], ord_h[j] + 1);
      }
      j++;
    }
    ans[ord_y[i]] = g.cur;
  }
  for (int i = 1; i <= q; i++) {
    cout << ans[i] << '\n';
  }
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...