【日记】12.3

12.3日记

线段树

染色问题困扰好久……

  1. 洛谷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。

染色解法在看。

  1. POJ2777,HDU5023。线段树染色问题。

功能:区间修改+区间查询不同数个数。不同颜色个数较少。

构造:状压每个颜色。v[id]表示当前区间所有颜色(状压)。维护区间值的|值。用lazy减少修改次数保证单次logn。

注意:多组数据清空啊……

  1. HDU1166。单点加减+区间求和。

比较简单,写的很快。

  1. HDU1754。单点修改+区间查询最大值
  2. HDU1698。区间修改+区间求和。

一个是注意清空,另外一个是pushdown操作,下方的时候要乘区间长度。以后还是按照大佬的那套吧,确实会更方便一些。

  1. OpenJ2299。n个不同数组成的数列,问有多少个逆序对。

模板:一维偏序。可以归并,也可以树状数组。首先离散化,之后从后往前,将a[i]置为1,将1-i-1的区间和加入答案即可。注意开LL!

总结

今天算是和线段树干上了,不过把基础的东西都做的很熟练了,修改加减之类的都弄明白了。

明天是单调数据结构,lazy标记困难版,CDQ分治。

猜你喜欢

转载自www.cnblogs.com/diorvh/p/11980564.html