cbx又A兩題%%%
T1比較水,只需要想到lcm以內的數都只能被唯一湊出就可以。
T2比較shi,畢竟std復雜度都不正確的題是不能稱之為完整的題的。
那么再感受一下T3滿滿的惡意
起點已經固定了,考慮當終點也固定時該怎么花費最小代價
一般的情況是,s和t都不在端點上,而端點又必須到達過,那么不可避免地,st兩側的邊都被覆蓋兩次
而且發現這兩側的邊,都可以在不增加代價的情況下隨意改變行動方向,所以覆蓋兩次就行了,沒必要覆蓋第三次。
為了方便描述,如果s在t的左邊(右邊的話就把序列翻過來)
那么大概的方向就是:向左先踩掉左端點,向右踩掉右端點,回過頭到達t
那么在兩側的邊(1-s和t-n)什么方向都可以,也就是有n-t+s-1次花掉強制次數L的機會
如果L<=那個次數,直接安排在兩邊什么地方就行了,注意左端點必須到達,必須分配一個;右端點向左跳到t至少用一次(如果t!=n),必須分配一個。
L>那個次數,只能從s和t之間選一些邊,讓s到t向右走的過程中,先跳到這些邊的右端點,再向左跳花掉L,然后正常向右。
先求出最優的t,最后再跑一次構造一個解。
先發出去,還要補一些奇怪的想法。
upd:改題時以及寫這篇隨筆時一些奇怪的想法:
1.把序列翻過來以后,L的值就不是L了,而是n-1-L,總感覺哪里不對勁,主要是L的過量、不足關系的判定上好像不夠直觀了,改題時猜想這樣是對的,現在發現自己懵逼了。應該是沒有問題,比如考慮s>l的情況,t>s時無論如何l都不會過量,而反過來后n-l-1則很容易就過量,好像冥冥中比較符合實際
2.在給st兩邊的線段強制分配次數的時候,應該考慮L不夠分的情況。如果s不在端點,t就必須在端點。我在代碼里特判了L==1的情況,不知道如果不特判能不能在第一問直接把t!=n的方案濾掉
3.給兩邊分配次數時,給1-s分從1開始分到s,給t-n分從t開始分到n,構造的時候則反過來行動,即后走左向邊。感覺這樣具有比較好的包容性
4.構造t>s的方案時可以與s<t的並在一起,只要把s和tswap一下,然后壓棧時把s也壓進去,那么棧頂和棧底一定分別是s和t,只要在外面判斷一下是從2輸出到n還是從n-1輸出到1,感覺這樣構造比較好,雖然還是非常難打。
uupd:上一個upd的2好像不行..把特判刪了段錯誤到飛起..
大概是因為只有l>1的時候,才能保證任何時刻要從堆里取出一個邊的時候,堆里都已經有一條邊..
這樣L或n-1-L的限制都不會大於n-2,在t拓展兩次之前都不會要求從中間找邊,給了堆足夠的准備之間