제출 #1366840

#제출 시각아이디문제언어결과실행 시간메모리
1366840tranvinhhuy2010Pilot (NOI19_pilot)C++20
100 / 100
346 ms39832 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int nmax = 1e6 + 5;
int n, q, h[nmax], p[nmax], sz[nmax], pos[nmax];
pair <int, int> qs[nmax];
bool dd[nmax];
ll cur, ans[nmax];

void init() {
    for (int i=1; i<=n; i++) {
        p[i] = i;
        sz[i] = 1;
    }
}

int root(int u) {
    if (u==p[u]) return u;
    return p[u] = root(p[u]);
}

void join(int u, int v) {
    u = root(u), v = root(v);
    if (u==v) return;

    if (sz[u]<sz[v]) swap(u, v);
    p[v] = u;
    sz[u] += sz[v];
}

ll cal(int len) {
    return 1LL * len * (len + 1) / 2;
}

bool cmp(int i, int j) {
    return h[i] < h[j];
}

int main() {
    ios_base::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++) {
        int y; cin >> y;
        qs[i] = {y, i};
    }

    for (int i=1; i<=n; i++)
        pos[i] = i;
    sort(pos + 1, pos + 1 + n, cmp);

    sort(qs + 1, qs + 1 + q);
    init();
    cur = 0;
    int ptr = 1;
    for (int i=1; i<=q; i++) {
        auto [y, id] = qs[i];

        while (ptr<=n && h[pos[ptr]]<=y) {
            int jojo = pos[ptr++];
            dd[jojo] = true;
            cur++;

            if (jojo>1 && dd[jojo - 1]) {
                int u = root(jojo), v = root(jojo - 1);
                cur += cal(sz[u] + sz[v]) - cal(sz[u]) - cal(sz[v]);
                join(u, v);
            }

            if (jojo<n && dd[jojo + 1]) {
                int u = root(jojo), v = root(jojo + 1);
                cur += cal(sz[u] + sz[v]) - cal(sz[u]) - cal(sz[v]);
                join(u, v);
            }
        }

        ans[id] = cur;
    }

    for (int i=1; i<=q; i++)
        cout << ans[i] << '\n';

    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…