清華集訓2015 V

2021-10-02 07:36:58 字數 2980 閱讀 8942

點此看題

本題的難點有兩個:區間減(帶比較),歷史最大值。

先解決第乙個問題,帶比較的區間減,我們也仿照這種形式,重新設計操作模式,設乙個操作二元組(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軸表示原數字,...