12.3日记
线段树
染色问题困扰好久……
- 洛谷P2161。安排约定问题。
思路:这道题其实应该是用平衡树的。不过如果涉及到平衡树,那么就考虑能不能直接套用set。既然有只保留一个的特性,那么就可以利用set只保留一个的特性,让冲突的设计重载运算符<让其相等,即可进行去重。由于每个元素只会进出一次,因此复杂度是正确的。
注意:重载set运算符要这么干:
struct Date{
int l,r;
Date(int a=0,int b=0):l(a),r(b){}
bool operator<(const Date &x)const{
return r<x.l;
}
};
set<Date> st;
多加const。
染色解法在看。
- POJ2777,HDU5023。线段树染色问题。
功能:区间修改+区间查询不同数个数。不同颜色个数较少。
构造:状压每个颜色。v[id]表示当前区间所有颜色(状压)。维护区间值的|值。用lazy减少修改次数保证单次logn。
注意:多组数据清空啊……
- HDU1166。单点加减+区间求和。
比较简单,写的很快。
- HDU1754。单点修改+区间查询最大值
- HDU1698。区间修改+区间求和。
一个是注意清空,另外一个是pushdown操作,下方的时候要乘区间长度。以后还是按照大佬的那套吧,确实会更方便一些。
- OpenJ2299。n个不同数组成的数列,问有多少个逆序对。
模板:一维偏序。可以归并,也可以树状数组。首先离散化,之后从后往前,将a[i]置为1,将1-i-1的区间和加入答案即可。注意开LL!
总结
今天算是和线段树干上了,不过把基础的东西都做的很熟练了,修改加减之类的都弄明白了。
明天是单调数据结构,lazy标记困难版,CDQ分治。