UOJ164 線段樹歷史最值查詢

2021-07-27 10:46:17 字數 1211 閱讀 6693

對於線段樹的歷史查詢我們可以用乙個二元組

定義(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 要麼在左邊取到,要麼在右邊取到,...