COGS 755 山海經 線段樹

2022-03-26 22:52:06 字數 3044 閱讀 8460

網上似乎這道題的題解很少?寫乙個吧

我跟這道題的淵源追溯到了上個學期剛剛學線段樹的那一天。。。

當時線段樹專題前邊的題都是一些板子就不一會就水過了,然後就看到了最後一題的它:山海經

那乙個上午,我竭盡全力,卻毫無收穫。

後來我下午繼續肛還是肛不動,但是mikufun大神,在剛學線段樹的階段,把這道我現在都要寫30min的難題給a了!

他當時的nb**:

1 #include2 #include3

using

namespace

std;

4struct

treet[1000000];8

void build(int l1,int r1,int

k)16

int mid=(l1+r1)/2

;17 build(l1,mid,k*2

);18 build(mid+1,r1,k*2+1

);19 t[k].da=t[k*2].da+t[k*2+1

].da;

20if(t[k*2].dal>=t[k*2].da+t[k*2+1

].dal)

24else

28if(t[k*2+1].dar>t[k*2+1].da+t[k*2

].dar)

32else

36if(max(t[k*2].dam,max(t[k*2+1].dam,t[k*2].dar+t[k*2+1].dal))==t[k*2

].dam)

40else

if(max(t[k*2].dam,max(t[k*2+1].dam,t[k*2].dar+t[k*2+1].dal))==t[k*2+1

].dam)

44else

if(max(t[k*2].dam,max(t[k*2+1].dam,t[k*2].dar+t[k*2+1].dal))==t[k*2].dar+t[k*2+1

].dal)48}

49 inline int sea_qu(int l1,int r1,int k,int x,int &ll,int &rr)

55if(x==1

) 59

if(x==2

) 63

} 64

int mid=(t[k].l+t[k].r)/2

,ans,a1,a2,a3,a4,a5,a6;

65int

a,b,c,d,e,g,h,z;

66if(x==1)75

}76return

a1;77}78

if(x==2)87

}88return

a2;89}90

if(!x)

95if(l1>mid)

99 a1=sea_qu(l1,r1,k*2,1

,a,b);

100 a2=sea_qu(l1,r1,k*2+1,2

,b,c);

101 a3=sea_qu(l1,r1,k*2,0

,h,d);

102 a4=sea_qu(l1,r1,k*2+1,0

,e,g);

103if(max(a1+a2,max(a3,a4))==a3)

107if(max(a1+a2,max(a3,a4))==a1+a2)

112if(max(a1+a2,max(a3,a4))==a4)

116}

117}

118int

main()

127return0;

128 }

view code

這可是在當時,也就是沒有題能打50行+的時候啊。

我當時看到有人a了都驚呆了。

我就去問mikufun,然後他說:「自己再想一想。」

我後來就一直想a掉這道題,可總有一些理由阻擋我蹣跚前進的腳步。

但現在我終於a了,很輕鬆釋然。

我記得當時老呂看只有mikufuna了這道題,鼓勵我們:「沒事,只要知識沒有丟,這些題你們以後看都很簡單的。」

可是我當時想:「這麼難的題,我恐怕一輩子都做不對了。」沒想到啊,才幾個月,變化已經這麼大了。

oi改變你我。

題解:線段樹維護左端點開始的最大值,右端點開始的最大值,區間最大值,以及它們的端點。

在子樹合併到父親時,父親左端點開始的最大值可以由左兒子左端點開始的最大值,左兒子全部值+右左端點開始的最大值來更新。

同理於父親右端點開始的最大值,區間最大值。但區間最大值還能夠由左兒子右端點的最大值+右兒子左端點的最大值來更新。

總體上細節挺多的,注意好它字典序問題。其實就是幾個順序的調整罷了。

在merge合併時,我為了之後的查詢更加方便,選擇了用結構體進行合併,因為在find查詢時由於[a,b]區間會被分成log個區間,因此等效於在子樹合併到父親。

1 #include2

#define n 100005

3#define inf 0x7f7f7f7f

4#define lch k<<1

5#define rch k<<1|1

6 inline int

read()

12struct nodetr[n<<2

];13

intn,m;

14 node merge(const node &t1,const node &t2)

29void build(int k,int l,int

r)32

const

int mid=(l+r)>>1

;33 build(lch,l,mid),build(rch,mid+1

,r);

34 tr[k]=merge(tr[lch],tr[rch]);35}

36 node find(int k,int l,int

r)44

intmain()

53 }

我的超短超帥**

COGS血帆海盜

對於已經增廣後的圖,會出現一些反向邊,首先跑一邊最大流,只有對於被增廣的路才有可能成為答案,考慮每一條被曾廣的路,如果他在殘留網路中兩個端點在同乙個強連通分量裡,必然有其他的路徑可以代替這條邊,比如圖中1 2 3 4 構成乙個環3 2 1 4 3,3 2可以替代原來的1 2,所以只有那些被增廣後,起...

COGS902 樂曲主題

這個題一開始想的是hash 列舉長度 sort尋重o n2lo g2n 50002 12 3 108,但是模乙個數就wa了,模兩個數就t了 卡得不行不行的。問題在於,實際上長度顯然是單調合法的 如果len行,則小於len一定行 所以我們可以變列舉為二分。巨集哥orz 這也正是我沒有想到的了,最近總是...

COGS 2259 異化多肽

qaq 很明顯我們是可以搞一下指數生成函式的 然而複雜度是o m n2 o m n2 無法優化 換個方式做生成函式 a x 表示 質量為 x 的 氨基酸有幾類 b x i 0 a x i b x i 0 a x i 顯然答案是b x 中的n次項係數 上面的式子即為乙個無限等比數列求和 度度的公式s ...