對於線段樹的歷史查詢我們可以用乙個二元組
定義(a, b)表示+a對b取max
我們用二元組(a, b), (c, d)分別表示當前以及歷史的標記;
注意順序的問題很重要,提醒一下過載運算子會很方便,還要注意負無窮相加得太多會爆,合併時對標記-oo取max很有必要,好像很抽象,那我在**裡注釋一下,防止大家被坑。。。。
#include
#include
typedef
long
long ll;
const ll oo = 1ll << 60;
const
int mxn = 2e6 + 10;
#define rep(i, s, t) for(int i = s; i <= t; ++i)
template
t max(t x, t y)
template
t read(t x = 0, t f = 1)
int n, m;
namespace segment_tree
ll big()
void clr()
tag link(ll _a, ll _b)
}t[mxn], g, h[mxn];
tag operator + (tag p, tag s)
tag operator ^ (tag p, tag s)
#define l(h) h<<1
#define r(h) h<<1|1
void push_down(int h)
/*(x, -oo)
(-x, 0)
(-oo, x)
*/void build(int h, int l, int r)
int m = (l + r) >> 1;
build(l(h), l, m);
build(r(h), m+1, r);
}void update(int h, int l, int r, int u, int v) else
}ll query(int h, int l, int r, int u, bool f)
};using
namespace segment_tree;
void input()
void output() else
}}int main()
UOJ 164 線段樹歷史最值
picks博士觀察完金星凌日後,設計了乙個複雜的電阻器。為了簡化題目,題目中的常數與現實世界有所不同。這個電阻器內有編號為 1 n1 n 的 nn 個獨立水箱,水箱呈圓柱形,底面積為 1 m21 m2,每個水箱在頂部和底部各有乙個閥門,可以讓水以 1 m3 s1 m3 s 的流量通過,每個水箱的上閥...
UOJ164 清華集訓2015 V(線段樹)
首先發現三種操作可以轉化為同樣的形式,定義 x,y x,y x,y 為區間加上x xx後與y yy取max的標記,那麼區間加就是 x,0 x,0 x,0 區間減就是 x 0 x,0 x,0 區間賦值就是 i nf,x inf,x inf,x 這個標記合併也比較方便,在 a,b a,b a,b 標記後...
uoj164 清華集訓2015 V 線段樹
傳送門 begin x max max x a,b a b max max x a a b a b max x a a max b a b end 這裡假設 a,b 是原來的標記,a b 是新加上的標記。考慮如何求歷史的最大值,對於乙個點的最大值 max x a,b 要麼在左邊取到,要麼在右邊取到,...