题目连接:Balance Segment Painting

Balance Segment Painting

因为要维护的是连续连段的长度,染色 $[p_i-1,p_i]$ 时,相当与把 $p_i-1$ 所在的连续线段和 $p_i$ 所在的连续线段合并。每条连续线段相当与是一个集合,

用并查集维护即可,可参考网上的实现。同时并查集需要维护集合的大小(按秩合并优化中已经有维护了)

示例代码

#include <bits/stdc++.h>
using namespace std;

#define MAX_N 1000000

// disjoint set

int fa[MAX_N + 1], sz[MAX_N + 1];

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

int find(int x) {
    if (x != fa[x]) fa[x] = find(fa[x]);
    return fa[x];
}

int merge(int x, int y) {
    int xx = find(x), yy = find(y);
    if (xx == yy) return sz[xx];
    if (sz[xx] > sz[yy]) swap(xx, yy);
    fa[xx] = yy;
    sz[yy] += sz[xx];
    return sz[yy];
}

// main

int main() {
    int n, p, max_len = 0;
    bool is_first = true;
    // Input
    scanf("%d", &n);
    init(n);
    for (int i = 0; i < n; ++i) {
        scanf("%d", &p);

        max_len = max(merge(p - 1, p) - 1, max_len);

        // Output
        if (is_first)
            is_first = false;
        else
            printf(" ");
        printf("%d", max_len);
    }
    puts("");

    return 0;
}