并查集维护序列段
Claire0918 · · 算法·理论
例题:P1840。有
考虑记
这时,如果
初始时,每个点都是黑点,即
对于
直接操作单次跳复杂度可以达到
不难发现每个点最多被染色
实现:
int main(){
scanf("%d %d", &n, &q);
iota(father, father + n + 1, 0);
while (q--){
int l, r;
scanf("%d %d", &l, &r);
r = get_f(r);
while (r >= l){
n--;
father[r] = r - 1;
r = get_f(r);
}
printf("%d\n", n);
}
return 0;
}
应用:P4145。
根号取下整可以快速变成
注意上一题每一次都会执行
实现:
r = get_f(r);
while (r >= l){
const int temp = sqrt(a[r]);
add(r, temp - a[r]);
if ((a[r] = temp) == 1){
father[r] = r - 1;
}
r = get_f(r - 1);
}