0
点赞
收藏
分享

微信扫一扫

CF69E Subsegments 题解 权值线段树

题目链接:https://codeforces.com/contest/69/problem/E

示例程序:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5, maxm = 1e7 + 5;

int n, K, a[maxn], tr[maxm], tc[maxm], inf = 1e9, rt = 1, idx = 1;
int ls[maxm], rs[maxm];

void push_up(int u) {
    tr[u] = tr[ls[u]] + tr[rs[u]];
}

void update(int p, int c, int l, int r, int &u) {
    if (!u)
        u = ++idx;
    if (l == r) {
        tc[u] += c;
        if (tc[u] == 1)
            tr[u] = 1;
        else
            tr[u] = 0;
        return;
    }
    int mid = l + (r - l) / 2;
    (p <= mid) ? update(p, c, l, mid, ls[u]) : update(p, c,  mid+1, r, rs[u]);
    push_up(u);
}

int query(int l, int r, int u) {
    if (!u || !tr[u])
        return 0;
    if (l == r)
        return l;
    int mid = l + (r - l) / 2;
    int res = query(mid+1, r, rs[u]);
    if (res) return res;
    return query(l, mid, ls[u]);
}

int main() {
    scanf("%d%d", &n, &K);
    for (int i = 1; i <= n; i++)
        scanf("%d", a+i);
    for (int i = 1; i <= n; i++) {
        update(a[i], 1, -inf, inf, rt);
        if (i > K)
            update(a[i-K], -1, -inf, inf, rt);
        int ans = query(-inf, inf, rt);
        if (i >= K) {
            if (!ans)
                puts("Nothing");
            else
                printf("%d\n", ans);
        }
    }
    return 0;
}



举报

相关推荐

0 条评论