写的很水。。大家绕道走吧。
学了十天了都。
刷了快30题了,水题居多= =。。基本线段树题型也就这样了吧。不过求区间第K数的我一直没做,没太理解怎么做。
大致分为这几类
操作:
1、区间覆盖,染色啊,异或啊,加上一个数,乘一个数,都变成某个数啊神马的。
2、涉及矩形的一些方法。
3、区间单值更新。
4、类似二分的查找位置。
5、类似约瑟夫环的一些东东。
6、。。。。
询问:
1、区间最值,第K值。
2、区间和,各种和。
3、区间连续区域的位置,连续区域最大长度。
4、和DP一起,区间最长XX子序列神马的。
5、。。。。
目前见过的就这几种吧,其实看起来蛮少的。恶心的是好几种操作,好几种询问混到一道题上,想shi。。
而且写线段树特别需要头脑清楚,因为设计好线段树的域很重要,而且需要想清楚各种更新,稍不留神就挂了。
能用函数写尽量用函数,要不写着写着会晕的。
LAZY标记是个很强大也很讨厌的东东 T T 。。。它省了好多时间,不过更新细节需要狠狠注意。
二维线段树我只会用树套树解决很水的问题,什么四分树不会,见的题不多。
合适的节点设计会省事很多,我越来越懒了 = =。。struct里加了好几个函数。
我的一维线段树的定义。不过就纠结的是,不能使用名字为len的变量了 = =。。
struct Tnode{
int l,r,val;
long long sum;
int len() { return r - l;}
int mid() { return MID(l,r);}
bool in(int ll,int rr) { return l >= ll && r <= rr; }
void lr(int ll,int rr){ l = ll; r = rr;}
};
二维的,基本和一维函数都差不多。
struct T2node
{
int l,r;
Tnode son[MAXM<<2];
int len() { return r - l;}
int mid() { return MID(l,r);}
bool in(int ll,int rr) { return l >= ll && r <= rr; }
void lr(int ll,int rr){ l = ll; r = rr;}
};