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;
}