點此看題
本題的難點有兩個:區間減(帶比較),歷史最大值。
先解決第乙個問題,帶比較的區間減,我們也仿照這種形式,重新設計操作模式,設乙個操作二元組(x,
y)(x,y)
(x,y
),假設對p
pp操作,得到的值為max
(p+x
,y)max(p+x,y)
max(p+
x,y)
,我們可以把三種修改都變成上述的形式:
發現使用上述方法兩個二元組是可合併的,因為都是取得max
maxma
x,我們只需要討論不同的取法即可,假設(a,
b),(
c,d)
(a,b),(c,d)
(a,b),
(c,d
)合併,得到的結果為(a+
c,ma
x(b+
c,d)
)(a+c,max(b+c,d))
(a+c,m
ax(b
+c,d
)),用線段樹維護,這樣我們就解決了一半的問題。
考慮歷史最大值,我們定義&
操作為二元組的兩個元素分別取最大值,如何合併行的歷史最大值呢?假設我們當前二元組為f
ff,歷史最大二元組為g
gg,需要合併的分別是f′,
g′f',g'
f′,g
′,由於歷史最大值的形態是max
(f1,
f2(f
1),f
3(f2
(f1)
)...
....
)max(f_1,f_2(f_1),f_3(f_2(f_1)).......)
max(f1
,f2
(f1
),f
3(f
2(f
1))
....
...)
這樣的,我們用g′(
f)g'(f)
g′(f
)來更新g
gg(也就是g=g
&(g′
(f))
g=g\&(g'(f))
g=g&(g
′(f)
)),我們的線段樹就維護f,g
f,gf,
g,然後就可以了。
講一下具體操作,二元組我們寫乙個pai
rpair
pair
,過載運算子,然後正常線段樹,區間修改,單點查詢。我們用−260
-2^−2
60作為最小值,過程中需要隨時和最小值比較,防止爆出最小值,可以寫在結構體的建構函式中,貼上**。
#include
#include
using
namespace std;
#define int long long
const
int m =
500005
;const
int inf =
(1ll
<<60)
;int
read()
int n,m,a[m]
;struct pair
intoperator
(const
int&r)
const
}i,a,f,t1[
4*m]
,t2[
4*m]
;pair operator&(
const pair &x,
const pair &y)
pair operator*(
const pair &x,
const pair &y)
void
change
(int i,pair f,pair g)
void
down
(int i)
void
updata
(int i,
int l,
int r,
int l,
int r)
down
(i);
int mid=
(l+r)
>>1;
updata
(i<<
1,l,mid,l,r)
;updata
(i<<1|
1,mid+
1,r,l,r);}
void
ask1
(int i,
int l,
int r,
int id)
down
(i);
int mid=
(l+r)
>>1;
if(mid>=id)
ask1
(i<<
1,l,mid,id)
;else
ask1
(i<<1|
1,mid+
1,r,id);}
void
ask2
(int i,
int l,
int r,
int id)
down
(i);
int mid=
(l+r)
>>1;
if(mid>=id)
ask2
(i<<
1,l,mid,id)
;else
ask2
(i<<1|
1,mid+
1,r,id);}
signed
main()
if(op==2)
if(op==3)
if(op==4)
if(op==5)
}}
UOJ 清華集訓2015 V
初始給出n個數,a 1 a n 有m個操作 1,把a l a r 加上x 2,把a l a r 減去x後和0取max 3,把a l a r 和x取max 4,輸出a x 5,輸出a x 的歷史最大值 即出現過的值的最大值 令標記 a,b 表示對於x進行max x a,b 那麼 操作1相當於 x,in...
164 清華集訓2015 V
一段序列,支援五個操作。1 區間加 2 區間減,然後對0取max 3 區間賦值 4 單點查詢 5 單點查詢歷史最大值 前三個操作可以看成一種 給原數加a,再和b取max。即 1 x max x a,0 2 x max x a,0 3 x max x inf,b 發現標記max x a1,b1 和ma...
uoj164 清華集訓2015 V
題目鏈結 164.清華集訓2015 v 大佬的部落格 jefflyy 這個東西,詭異的標記下傳。一共有五種操作,區間加法,區間減法 減到0就不減了 區間覆蓋,單點詢問,單點歷史最大值。非常巧妙的使用了乙個pair來進行標記。y max x a,b 就是可以看做建立乙個直角座標系,其中x軸表示原數字,...