线段树,区间修改
网上老哥思路:
线段树节点存储该区间内的颜色,单点区间肯定就是染成的颜色,大区间如果标记为-1则表示该区间由多种颜色的小区间组成,
注意初始情况下木板均为同一种颜色,可以记为1。一共有最多30种颜色,所以用bool vis[30]数组标记,在每次查询的时候清空,
查询到点或区间颜色相同时,对该颜色标记为true,最后统计1~T这T种颜色使用的个数即vis是true的情况
本题要点:
1、节点维护的信息:
区间范围: [l, r]
区间的颜色: color
延迟标记: flag
2、 套用线段树,延迟修改的模板。 注意,这里给出的区间 [A, B], 可能存在 A > B 的情况。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int MaxN = 1e5 + 10;
bool vis[40];
int n, m, T;
struct segTree
{
int l, r;
int color;
int flag;
}tree[MaxN * 4];
void build(int p, int l, int r)
{
tree[p].l = l, tree[p].r = r;
if(l == r)
{
tree[p].color = 1, tree[p].flag = 0;
return;
}
int mid = (l + r) / 2;
build(p * 2, l, mid);
build