網上似乎這道題的題解很少?寫乙個吧
我跟這道題的淵源追溯到了上個學期剛剛學線段樹的那一天。。。
當時線段樹專題前邊的題都是一些板子就不一會就水過了,然後就看到了最後一題的它:山海經
那乙個上午,我竭盡全力,卻毫無收穫。
後來我下午繼續肛還是肛不動,但是mikufun大神,在剛學線段樹的階段,把這道我現在都要寫30min的難題給a了!
他當時的nb**:
1 #include2 #include3view codeusing
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 }
這可是在當時,也就是沒有題能打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 ...