题目链接: poj 2777
题意:板块涂色,询问区间内颜色的数目。
解题:因为题目给出颜色数目最多30种,因此可以借用二进制中的或运算 来更新父区间。 但是这写的是线段树常用的懒人标记------延迟更新。
别人已经写的很好了,直接借用吧,博客链接 https://blog.csdn.net/Tong_zhi/article/details/82683219
言下之意就是 当遇到的区间,已经被包含 在更新区间内, 如果按照常规的思路,那么就是继续遍历到叶结点,一一进行修改,但是这样很浪费时间。
这里借用了懒标记,也就是对这种 纯区间(区间内的元素都需要更改成某值),我们只需要对他加一个标记。当下次更新或者询问的时候再进行修改。
修改操作: 先将自己的标记赋值给左右儿子,然后取消自己的标记,对于左右儿子的标记,也一样当下次更新或者询问的时候再进行修改。
下推操作(懒标记):
void pushdown(int rt)
{if (tree[rt].lazy){tree[rt<<1].col&#61;tree[rt<<1|1].col&#61;tree[rt].lazy;tree[rt<<1].lazy&#61;tree[rt<<1|1].lazy&#61;tree[rt].lazy;tree[rt].lazy&#61;0;}return ;
}
AC代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include