蓝桥杯 I.双向排序
題目鏈接
題解:
比賽時就直接寫了一個暴力sort交上,能騙一點分是一點
昨晚看了acwing的講解,現在結合我的思路更新正解
題目中設計兩個操作,一個是選定前x個數,使其降序,另一個是選定后y個數,使其升序
問最后操作完,輸出序列
題目就兩個操作,我們考慮多種情況:
1.連續出現多個操作一。圖中藍色區域為操作1,如果連續出現多個操作1,雖然區間有長有短,但效果都是將區間內降序,我們不難發現最后有效果的是最長的區間部分(即圖中第三個藍區間),因為這個操作排完序后,之后連續的操作1都不會其效果(因為已經排好序)
說的有些啰嗦,總結:連續操作1取最長區間
2.連續的操作2
同理:連續的操作2,我們也取最長部分
情況1和情況2使得最終的操作是1和2更替進行,(因為如果有連續就取最長)
3.操作1與操作2交替
圖中藍色部分為操作1,綠色部分為操作2,
首先我們要知道序列一開始是升序的(即黑色區間),所以F中的數<G<H
第一個操作肯定是操作1,因為操作2沒影響
操作1為降序,B>A,而綠區間為升序,我們要注意H區間的數是大于F和G的,我們操作1只對區間A,B進行了修改,所以H>A和B,那么操作2對C和D區間(即G和H)進行修改時,D區間保持不變,(因為D區間本來就是升序,為啥要變)但是C區間目前是降序,所以要變成升序。
這樣看來,改變的只有
接下來應該是操作1了,如果接下來的操作1比之前的操作1的區間長度長,那之前的操作1的區間就可以省略,因為后來的操作完全將之前的覆蓋了,如果把之前的操作1省略掉,就會出現兩個操作2相鄰,為了保證兩個操作交替進行,所以上一個操作1和操作2都會消失(看下面第二個圖中被矩形選中的部分為省略)
因為我們可以得到,操作1和2交替進行,且相比于上一次操作,本次操作的區間長度越來越短,因此相交部分也越來越短,直到兩者不再相交,到這時修改將不再起作用,每次操作其實反轉的也只有相交部分
我們用這個圖來總結一下:紅色線段部分修改,藍色線段保持上一次狀態
我們設紅色線段的兩端分別是x和y,因為我們每次要做的就是反轉區間[x,y],且x和y是不斷向內靠近的
反轉的操作可以用平衡樹或者線段樹,但是沒必要
因為我們說了相交區間越來越小,當執行操作1時,本質是y向內靠,當執行操作2時,本質是x向內靠,
當x和y向內靠時,經過的點在后續不會發生改變,那我們就直接給他賦值即可,我們用一個變量K,K一開始為n,第一個操縱為1,我們要將y移動到第一個紅線的右端(下圖),移動過程中給非紅線的部分一次賦值,并k–
最終實現的效果如下:
這就實現了反轉的操作
我講的不是很清楚,有什么問題可以評論區里問
代碼:
好題,代碼為yxc寫的,這個代碼邏輯比我寫的清晰
代碼我有詳細注釋
總結
以上是生活随笔為你收集整理的蓝桥杯 I.双向排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 红皮核桃的功效与作用、禁忌和食用方法
- 下一篇: 琥珀粉的功效与作用、禁忌和食用方法