锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
鏈矙鑼跺幓騫存浘緇忕敤鍙岀嚎孌墊爲鐨勬柟娉曟崏浜嗚繖棰橈紙璇﹁榪欓噷錛夛紝鏈榪戦噸鏂板瑙嗚繖棰樺彂鐜幫紝鍊熷姪騫寵 鏍戯紝鍙互寰楀埌鏇寸畝鍗曠殑鏂規(guī)硶銆?br />
棰樼洰澶ф剰錛?br />鏈変竴涓暱搴︿負N鐨勫唴瀛樻潯錛屾瘡涓綅緗殑鐘舵佹湁鍗犵敤鍜屼笉鍗犵敤涓ょ錛屾湁4縐嶆搷浣滐細
錛?錛塕eset錛氭竻絀烘墍鏈夊唴瀛橈紙鍗沖皢鎵鏈変綅緗殑鐘舵佹敼涓轟笉鍗犵敤錛屽垹闄ゆ墍鏈夊唴瀛樺潡錛夛紱
錛?錛塏ew x錛氱敵璇蜂竴涓柊鐨勫唴瀛樺潡錛屽嵆鎵懼埌涓涓暱搴︿負x鐨勮繛緇笉鍗犵敤浣嶇疆鍖洪棿錛屽皢瀹冧滑鏍囪涓哄崰鐢紝鑻ユ湁澶氫釜榪欐牱鐨勫尯闂達紝鍙栨渶宸﹁竟鐨勶紝鑻ユ湪鏈夎緭鍑篟eject New錛?br />錛?錛塅ree x錛氬湪宸茬敵璇風殑鍐呭瓨鍧椾腑錛屾壘鍒板寘鍚綅緗畑鐨勫茍閲婃斁錛堝皢璇ュ唴瀛樺潡鍒犻櫎錛屽悓鏃跺叾鍗犵敤鐨勬墍鏈変綅緗敼涓轟笉鍗犵敤錛夛紝鑻ユ湪鏈夊唴瀛樺潡鍖呭惈浣嶇疆x錛屽垯杈撳嚭Reject Free錛?br />錛?錛塆et x錛氭壘鍑哄凡鐢寵鐨勫唴瀛樺潡涓紝宸﹁搗絎瑇涓紝騫惰緭鍑哄叾宸︾鐐癸紱鑻ュ凡鐢寵鐨勫唴瀛樺潡鏁扮洰涓嶈凍x涓紝鍒欒緭鍑篟eject Get銆?br />
鍙互鍙戠幇錛屾瘡涓凡緇忕敵璇風殑鍐呭瓨鍧楀敖綆′唬琛ㄤ竴孌靛尯闂達紝浣嗕粛鐒舵槸鐙珛鐨勫崟浣嶏紝鍥犳錛屽彲浠ユ妸鍐呭瓨鍧楀綋鎴愮粨鐐癸紝鐢ㄥ鉤琛℃爲緇存姢錛堝叧閿瓧涓哄唴瀛樺潡鐨勫乏绔偣浣嶇疆錛夛紝New鎿嶄綔涓唴瀛樺潡鐨勬彃鍏ヤ笌Free鎿嶄綔涓唴瀛樺潡鐨勫垹闄ゅ潎鍦ㄦ騫寵 鏍戝唴榪涜錛孯eset鎿嶄綔鍙渶瑕佸皢鏁存5鏍戦攢姣佸嵆鍙?br />闂鏄紝鍦∟ew鎿嶄綔涓紝闇瑕佹壘鍒頒竴涓暱搴︿負x鐨勮繛緇笉鍗犵敤鍖洪棿錛岃岃繛緇殑涓嶅崰鐢ㄥ尯闂村茍涓嶆槸鐙珛鐨勫崟浣嶏紝鍥犳闇瑕佷嬌鐢ㄧ嚎孌墊爲緇存姢銆傚湪綰挎鏍戜腑錛岄渶瑕佺淮鎶?lt;1>緇撶偣鍖洪棿鍐呮渶闀胯繛緇笉鍗犵敤鍧楃殑闀垮害錛?lt;2>緇撶偣鍖洪棿宸︾銆佸彸绔繛緇笉鍗犵敤鍧楃殑闀垮害錛堝惁鍒欐棤娉曠淮鎶?lt;1>錛夛紱鍚屾椂錛岀敱浜庡湪New鎿嶄綔涓渶瑕佸尯闂存暣浣撴敼鍗犵敤錛孎ree鎿嶄綔涓張闇瑕佸尯闂存暣浣撴敼涓嶅崰鐢紝鎵浠ュ簲褰撴敮鎸佹暣浣撴敼鍊肩殑鏍囪錛屽浜嶳eset鎿嶄綔錛屽彧闇瑕佸叏閮ㄤ綅緗敼涓嶅崰鐢ㄥ嵆鍙紙涓嶈兘閲嶆柊寤烘爲錛侊紒錛夛紱
榪欐牱錛屽埄鐢ㄤ竴媯靛鉤琛℃爲鍔犱竴媯電嚎孌墊爲錛屽氨鍙互寰楀埌涓涓緢綆鍗曠殑鏂規(guī)硶浜嗭紙浠g爜閲忔槸鍙屽鉤琛℃爲鎴栧弻綰挎鏍戠殑涓鍗婂乏鍙籌級錛?br />
榪欓鐨勫惎紺烘槸錛屽湪瑙e喅鏁版嵁緇撴瀯緇熻綾婚鐨勬椂鍊欙紝鍒板簳閫夌敤浠涔堟牱鐨勬暟鎹粨鏋勶紝鏄湁璁茬┒鐨勶紝鍥犱負瀹冨皢鐩存帴褰卞搷鍒扮紪紼嬪鏉傚害銆備竴鑸潵璇達紝綰挎鏍戞瘮騫寵 鏍戝ソ鍐欙紝浣嗘槸瀵規(guī)湰棰樿岃█錛屽弻綰挎鏍戝弽鑰屼笉濡傚鉤琛℃爲鍔犵嚎孌墊爲濂藉啓錛岃繖鏄洜涓哄浜庡唴瀛樺潡浣跨敤騫寵 鏍戠淮鎶ゆ瘮浣跨敤綰挎鏍戠淮鎶ゆ洿濂姐傚湪浠ュ悗鍋氳繖縐嶉鐨勬椂鍊欙紝瑕佸鎯充竴涓嬶紝鎵懼埌綆渚挎柟娉曘?br />
]]>
鍙互鍙戠幇鏈灝辨槸姹備竴涓瘮鐜噐ate錛屼嬌寰楃i涓漢錛堝鏋滅敤鐨勮瘽錛夊伐璧勪負rate*Qi錛屽茍涓旇繕瑕佹弧瓚充互涓嬩袱涓檺鍒舵潯浠訛細
錛?錛夋瘡浜虹殑鏈浣庡伐璧勯檺鍒訛細絎琲涓漢濡傛灉鐢ㄧ殑璇濓紝鏈塺ate*Qi>=Si錛屽嵆rate>=Si/Qi錛?br />錛?錛夋誨紑閿闄愬埗錛歳ate*鎵鏈夌敤鐨勪漢鐨凲鍊間箣鍜?lt;=W錛屽嵆鎵鏈夌敤鐨勪漢鐨凲鍊間箣鍜?lt;=W/rate銆?br />榪欐牱錛屽彲浠ュ厛灝嗘墍鏈変漢鎸夌収(S/Q)鐨勫奸掑鎺掑簭錛岀劧鍚庢灇涓鵑渶瑕佺敤鐨勬渶鍚庝竴涓漢錛堟帓搴忓悗鐨勶紝涔熷氨鏄疭/Q鍊兼渶澶х殑閭d釜浜猴級錛岃涓篿錛屽垯鎬昏姳璐規(guī)渶鐪佺殑鍋氭硶鏄劇劧鏄彇rate=Si/Qi銆傜劧鍚庢牴鎹紙2錛夊紡寰楀嚭“鎵鏈夌敤鐨勪漢鐨凲鍊間箣鍜?#8221;鐨勬渶澶у糤0=W/rate錛屽叾涓紝絎琲涓漢鏄繀欏昏鐢ㄧ殑錛屾晠灝哤0鍊煎厛鍑忓幓Qi錛堣嫢W0<Qi錛屽垯絎琲涓漢涓嶅彲浣跨敤錛夛紝鍓╀笅鐨勯棶棰樺氨鍙樻垚浜嗗湪絎?~(i-1)涓漢涓紙鎺掑簭鍚庣殑錛夐夊彇涓浜涗漢錛屼嬌寰椾粬浠殑Q鍊間箣鍜屼笉澶т簬W0錛屽茍涓旈夊彇鐨勪漢灝藉彲鑳藉銆傛樉鐒惰繖鍙互鐢ㄨ椽蹇冩潵瀹炵幇錛屽嵆閫夊彇Q鍊兼渶灝忕殑鑻ュ共涓漢銆傛帴涓嬫潵錛岀敱浜庨鐩腑N<=500000錛岃鏄庨渶瑕佺敤鏁版嵁緇撴瀯鏉ヤ紭鍖栵紝鍙槸Q鐨勪笂闄愬彧鏈?0000涓擰涓烘鏁存暟錛屽洜姝わ紝綰挎鏍戞槸鏈濂界殑閫夋嫨銆傚緩绔嬩竴媯佃〃紺篬1, 20000]鐨勭嚎孌墊爲錛屾瘡涓粨鐐瑰瓨鏀句袱涓澶栫殑鍊鹼細sz鍜宻um錛屽垎鍒〃紺篞鍊間綅浜庤緇撶偣浠h〃鐨勫尯闂村唴鐨勪漢鐨勬繪暟浠ュ強榪欎簺浜虹殑Q鍊兼誨拰銆傜劧鍚庯紝闇瑕佽В鍐充笂榪板瓙闂鏃訛紝浠庢牴緇撶偣寮濮嬭冨療緇撶偣鐨剆z鍊鹼紝涓嶆柇寰涓嬫壘鍗沖彲錛堣繖鏈夌偣鍍忓鉤琛℃爲鐨勬壘絎琄灝忕殑鎿嶄綔錛夈?br />鎬繪椂闂村鏉傚害錛歄(N * (log20000 + logN))錛堣繕鏈夋帓搴忕殑鏃墮棿錛?br />浠g爜
銆?銆?a title="RQNOJ469" >RQNOJ469
鍏堟寜鐓т換鎰忎竴縐嶅睘鎬э紙榪欓噷涓篈錛夐掑鎺掑簭錛岀劧鍚庢灇涓懼糹錛屾帓搴忓悗絎?浣崀絎琲浣嶇殑鍏ㄩ儴緇橝錛堢湅A灞炴э紝瀹冧滑涓瑼灞炴ф渶澶х殑涓瀹氭槸i錛夛紝鎺掑簭鍚庣(i+1)浣嶅強浠ュ悗鐨勶紝鐪嬪叾B銆丆涓ょ灞炴х殑澶у皬錛岃嫢B灞炴ф洿灝忓氨鐪婤灞炴э紝鑻灞炴ф洿灝忓氨鐪婥灞炴э紝鐒跺悗寰楀嚭涓ょ灞炴х殑鏈澶у煎嵆鍙傚洜姝ゅ彲浠ュ緱鍒頒笅闈㈢殑綆楁硶錛氬厛鎺掑簭錛岀劧鍚庡皢鎵鏈夌殑姣涚殑B鎴朇灞炴э紙鍝鏇村皬灝辯湅鍝錛夋彃鍏ュ鉤琛℃爲錛堣繖閲岄渶瑕佷袱媯靛鉤琛℃爲錛屼竴媯靛瓨鏀綛灞炴х殑鍊鹼紝涓媯靛瓨鏀綜灞炴х殑鍊鹼級錛岀劧鍚庨掑鏋氫婦i錛堟敞鎰廼=0鐨勬儏鍐典笉瑕佹紡鎺夛級錛屽皢絎琲浣嶇殑B鎴朇灞炴у湪騫寵 鏍戜腑鍒犻櫎錛岀劧鍚庢壘鍑轟袱媯靛鉤琛℃爲涓殑鏈澶у煎嵆鍙?br />浣嗘槸闇瑕佹敞鎰忎竴縐嶇壒孌婃儏鍐碉細鎵鏈夌殑姣涢兘鐪嬪悓涓涓睘鎬э紝姝ゆ椂鎸夌収涓婇潰鐨勭畻娉曞彲鑳芥眰涓嶅嚭鏈浼樿В錛屾瘮濡傦細
10 6 5
10 2 8
姝ゆ椂錛岀1涓狢灞炴ф洿灝忥紝絎?涓狟灞炴ф洿灝忥紝鑻ョ1涓湅C灞炴э紝絎?涓湅B灞炴э紝鍒欐誨拰涓?+2=7錛岃屽鏋滀袱涓兘鐪婤灞炴у垯鎬誨拰涓?銆傛鏃跺氨闇瑕佺壒鍒わ紙棰勫厛姹傚嚭涓夌灞炴т腑鐨勬渶澶у鹼級錛岀劧鍚庡啀鐢ㄤ笂闈㈢殑綆楁硶姹傝В錛屽氨鑳戒繚璇佹眰鍑烘渶浼樿В浜嗐?br />浠g爜
銆?銆?a title="PKU2985" >PKU2985
騫舵煡闆?騫寵 鏍戝熀鏈搷浣滐紝姘撮錛屼笉瑙i噴銆?br />浠g爜
銆?銆慔NOI2011 鎷彿鍖歸厤Brackets錛堢洰鍓嶅彲浠ョ湅榪欎釜甯栧瓙錛?br />Splay Tree緇存姢搴忓垪闂銆傚浜庝竴孌墊嫭鍙峰簭鍒桝[1..len]錛屽畾涔変紭鍏堢駭P[0..len]濡備笅錛?br />P[0]=0
P[i]=P[i-1]+1錛坕>0涓擜[i]涓哄乏鎷彿錛?br />P[i]=P[i-1]-1錛坕>0涓擜[i]涓哄彸鎷彿錛?br />鐒跺悗錛孲play Tree鐨勬瘡涓粨鐐歸渶瑕佽褰曚竴涓猌鍊煎拰M鍊鹼紝鍒嗗埆琛ㄧず璇ョ粨鐐逛唬琛ㄧ殑鎷彿搴忓垪涓渶鍚庝竴涓厓绱犵殑浼樺厛綰у拰浼樺厛綰ф渶灝忕殑鍏冪礌鐨勪紭鍏堢駭銆傚垯鍙互璇佹槑錛氳繖孌墊嫭鍙峰簭鍒楄皟鏁磋嚦騫寵 鑷沖皯闇瑕佹敼鍙樼殑鎷彿鏁扮洰涓?-M+K+1) / 2錛屽叾涓璌=Z+((-M+1)/2)*2錛堟敞鎰忚繖閲岀殑/鏄暣闄わ級錛屾澶栫敱浜庢湁swap鍜宨nvert涓や釜鎿嶄綔錛屽洜姝ら渶瑕佽褰昍M銆乀M銆丷TM鍊鹼紝鍒嗗埆琛ㄧず灝嗚鎷彿搴忓垪鎵цswap鎿嶄綔鍚庣殑搴忓垪鐨凪鍊箋佹墽琛宨nvert鎿嶄綔鍚庣殑搴忓垪鐨凪鍊鹼紝浠ュ強鍚屾椂鎵цswap鍜宨nvert鎿嶄綔鍚庡簭鍒楃殑M鍊箋?br />涓嶈繃錛屾湰棰橀渶瑕佷弗閲嶆敞鎰忕殑鏄細铏界劧replace鎿嶄綔鐨勬爣璁幫紙浠g爜涓殑mk0錛変細瑕嗙洊鎺塻wap錛堜唬鐮佷腑鐨刴k1錛夊拰invert錛堜唬鐮佷腑鐨刴k2錛夋搷浣滅殑鏍囪錛屼絾鏄湪涓嬫斁鏍囪鐨勬椂鍊欙紝闇瑕佸涓夌鏍囪閫愪竴鍒ゆ柇錛宮k0鍜宮k1銆乵k2騫朵笉鏄笉鑳藉叡瀛樼殑錛佸洜涓烘湁鍙兘鍏堟墦涓妋k0鏍囪鍚庡啀鎵撲笂mk1鎴杕k2鏍囪銆?/strong>
鏈铏界劧鏄潤鎬佺殑錛屼絾浠嶇劧涓嶈兘浣跨敤綰挎鏍戯紝鍥犱負綰挎鏍戞棤娉曟敮鎸佹暣浣撶炕杞紙rev錛夋搷浣溿?br />浠g爜
]]>
鏈矙鑼惰榪囩殑鏈鐚ョ悙鐨凞P棰樺晩鍟婂晩鍟婂晩鍟婂晩鍟婂晩鍟婂晩鍟婂晩鍟婂晩鍟婂晩鍟婂晩鍟?#8230;…
璁綟[i]涓哄皢A[1..i]鎷嗗垎鎴愯嫢騫叉鐨勬渶澶у兼渶灝忓拰錛屽垯鏈?br />F[i]=min{F[j] + max[j+1, i]}錛圔[i]<=j<i錛夛紝鍏朵腑max[j+1, i]琛ㄧずA[j+1..i]涓殑鏈澶у鹼紝B[i]琛ㄧず浠巌鍚戝乏鏈榪滃彲浠ュ歡浼稿埌鍝噷錛堜篃灝辨槸婊¤凍SUM[x..i]<=m鐨勬渶灝忕殑x鍊鹼級銆侭鏁扮粍鍙互閫氳繃棰勫鐞嗗湪O(N)鏃墮棿鍐呭緱鍒般?br />杈圭晫錛欶[0]=0銆?br />
涓嬮潰鏄紭鍖栬繃紼嬨侸ZP紲炵妵鐨勮鏂囬噷闈㈠凡緇忓璇︾粏浜嗐傝繖閲屽彧鏄畝瑕佽鏄庝竴涓嬨?br />棣栧厛瀹規(guī)槗璇佹槑錛孎鏄崟璋冮掑鐨勩?br />鐒跺悗涓涓緢鍏抽敭鐨勫畾鐞嗘槸錛?strong style="color: red">鑻[i]鐨勬渶浼樺喅絳栦負j錛屽垯鏈堿[j]>∀A[k]錛坖<k<=i錛夈?/strong>
璇佹槑錛氱敤鍙嶈瘉娉曘傝嫢A[j+1..i]涓瓨鍦ㄤ笉灝忎簬A[j]鐨勫鹼紝鍒欏彲寰梞ax[j..i]=max[j+1..i]錛屽張鍥犱負F鍗曡皟閫掑錛屾墍浠[j-1]+max[j..i]<=F[j]+max[j+1.i]錛屽嵆鍐崇瓥(j-1)涓瀹氫笉姣斿喅絳杍宸紝涔熷氨鏄喅絳杍涓嶅彲鑳芥垚涓烘渶浼樺喅絳栥?br />榪欐牱錛屽彲浠ョ淮鎶や竴涓笅鏍囦弗鏍奸掑銆丄鍊間弗鏍奸掑噺鐨勯槦鍒桻錛堝嵆瀵逛簬闃熷垪涓殑浠繪剰涓や釜鍏冪礌Q[i]鍜孮[j]錛岃嫢i<j錛屽垯Q[i].pos<Q[j].pos涓擜[Q[i].pos]>A[Q[j].pos]錛屽叿浣撳疄鐜版椂pos鍙渷鐣ワ級銆傚垯鍙兘鎴愪負鏈浼樺喅絳栫殑鍐崇瓥瑕佷箞鏄湪榪欎釜闃熷垪Q閲岋紝瑕佷箞鏄疊[i]銆傚浜庨槦鍒椾腑鐨勬煇涓喅絳朡[x]錛岃鍐崇瓥瀵煎嚭鐨勫間負F[Q[x]]+A[Q[x + 1]]錛堝緢瀹規(guī)槗璇佹槑max[Q[x]+1..i]=A[Q[x + 1]]錛夛紝鎵懼埌榪欎簺瀵煎嚭鐨勫間腑鐨勬渶灝忓煎嵆鍙紙娉ㄦ剰錛岄槦灝懼厓绱犳病鏈夊鍑哄鹼級銆傚浜庡喅絳朆[i]錛屽彧闇瑕佸湪棰勫鐞嗙殑鏃跺欏悓鏃跺緱鍒癕AX[i]=max[B[i]+1..i]鍗沖彲錛堜篃鍙互鍦∣(N)鏃墮棿鍐呭緱鍒幫級錛屽喅絳朆[i]瀵煎嚭鐨勫間負F[B[i]]+MAX[i]銆?br />鍦ㄥ垹闄ら槦棣栬繃鏃跺厓绱犵殑鏃跺欙紝闇瑕佹妸瀵煎嚭鍊間篃鍒犻櫎錛屽垹闄ら槦灝懼厓绱犱篃涓鏍鳳紝鎻掑叆鐨勬椂鍊欙紝鑻ユ彃鍏ュ墠闃熷垪涓嶄負絀猴紝鍒欓渶瑕佹彃鍏ヤ竴涓鍑哄箋備篃灝辨槸錛岄渶瑕佷竴涓敮鎸佸湪瀵規(guī)暟鏃墮棿鍐呰繘琛屾彃鍏ャ佸垹闄や換鎰忕粨鐐廣佹壘鏈灝忓肩瓑鎿嶄綔錛屾樉鐒剁敤騫寵 鏍戞渶濂姐?br />
娉ㄦ剰浜嬮」錛?br />錛?錛変笉綆℃槸鍦ㄩ槦棣栧垹闄よ繕鏄湪闃熷熬鍒犻櫎錛岃嫢鍒犻櫎鐨勬槸闃熷垪涓殑鏈鍚庝竴涓厓绱狅紝鍒欎笉闇瑕佸湪騫寵 鏍戜腑鍒犻櫎瀵煎嚭鍊鹼紱
錛?錛夋彃鍏ユ椂錛岃嫢鎻掑叆鍓嶉槦鍒椾負絀猴紝鍒欎笉闇瑕佸湪騫寵 鏍戜腑鎻掑叆瀵煎嚭鍊鹼紱
錛?錛夊湪璁$畻F[i]鏃訛紝搴斿厛灝嗗喅絳杋鍘嬪叆銆?br />
浠g爜錛?
#include <stdio.h>
using namespace std;
#define re1(i, n) for (int i=1; i<=n; i++)
const int MAXN = 100001;
struct node {
int l, r, p, sz0, sz, mul;
long long v;
} T[MAXN];
const long long INF = ~0Ull >> 2;
int n, N = 0, a[MAXN], b[MAXN], MAX[MAXN], Q[MAXN], front = 0, rear = -1, root = 0;
long long m, F[MAXN], res = 0;
void init()
{
cin >> n >> m;
re1(i, n) scanf("%d", &a[i]); a[0] = ~0U >> 2;
}
void prepare()
{
re1(i, n) if (a[i] > m) {res = -1; return;}
int x = 1;
long long sum = 0;
re1(i, n) {
for (sum+=a[i]; sum>m; sum-=a[x++]) ;
b[i] = x - 1;
}
re1(i, n) {
for (; front<=rear && Q[front]<=b[i]; front++) ;
for (; front<=rear && a[Q[rear]]<=a[i]; rear--) ;
Q[++rear] = i; MAX[i] = a[Q[front]];
}
}
void vst(int x)
{
if (x) {
cout << T[x].v << ' ';
vst(T[x].l); vst(T[x].r);
}
}
void slc(int _p, int _c)
{
T[_p].l = _c; T[_c].p = _p;
}
void src(int _p, int _c)
{
T[_p].r = _c; T[_c].p = _p;
}
void upd(int x)
{
T[x].sz0 = T[T[x].l].sz0 + T[T[x].r].sz0 + T[x].mul;
T[x].sz = T[T[x].l].sz + T[T[x].r].sz + 1;
}
void lrot(int x)
{
int y = T[x].p;
if (y == root) T[root = x].p = 0; else {int p = T[y].p; if (y == T[p].l) slc(p, x); else src(p, x);}
src(y, T[x].l); slc(x, y); T[x].sz0 = T[y].sz0; T[x].sz = T[y].sz; upd(y);
}
void rrot(int x)
{
int y = T[x].p;
if (y == root) T[root = x].p = 0; else {int p = T[y].p; if (y == T[p].l) slc(p, x); else src(p, x);}
slc(y, T[x].r); src(x, y); T[x].sz0 = T[y].sz0; T[x].sz = T[y].sz; upd(y);
}
void maintain(int x, bool ff)
{
int z;
if (ff) {
if (T[T[T[x].r].r].sz > T[T[x].l].sz) {z = T[x].r; lrot(z);}
else if (T[T[T[x].r].l].sz > T[T[x].l].sz) {z = T[T[x].r].l; rrot(z); lrot(z);} else return;
} else {
if (T[T[T[x].l].l].sz > T[T[x].r].sz) {z = T[x].l; rrot(z);}
else if (T[T[T[x].l].r].sz > T[T[x].r].sz) {z = T[T[x].l].r; lrot(z); rrot(z);} else return;
}
maintain(T[z].l, 0); maintain(T[z].r, 1); maintain(z, 0); maintain(z, 1);
}
int find(long long _v)
{
int i = root;
long long v0;
while (i) {
v0 = T[i].v;
if (_v == v0) return i; else if (_v < v0) i = T[i].l; else i = T[i].r;
}
return 0;
}
int Find_Kth(int K)
{
int i = root, s0, m0;
while (1) {
s0 = T[T[i].l].sz0; m0 = T[i].mul;
if (K <= s0) i = T[i].l; else if (K <= s0 + m0) return i; else {K -= s0 + m0; i = T[i].r;}
}
}
void ins(long long _v)
{
if (!root) {
T[++N].v = _v; T[N].l = T[N].r = T[N].p = 0; T[N].sz0 = T[N].sz = T[N].mul = 1; root = N;
} else {
int i = root, j;
long long v0;
while (1) {
T[i].sz0++; v0 = T[i].v;
if (_v == v0) {T[i].mul++; return;} else if (_v < v0) j = T[i].l; else j = T[i].r;
if (j) i = j; else break;
}
T[++N].v = _v; T[N].l = T[N].r = 0; T[N].sz0 = T[N].sz = T[N].mul = 1; if (_v < v0) slc(i, N); else src(i, N);
while (i) {T[i].sz++; maintain(i, _v > T[i].v); i = T[i].p;}
}
}
void del(int x)
{
if (T[x].mul > 1) {
T[x].mul--; while (x) {T[x].sz0--; x = T[x].p;}
} else {
int l = T[x].l, r = T[x].r, p;
if (l && r) {
int y; while (y = T[l].r) l = y;
T[x].v = T[l].v; T[x].mul = T[l].mul; p = T[l].p;
if (l == T[p].l) slc(p, T[l].l); else src(p, T[l].l);
while (p) {upd(p); p = T[p].p;}
} else {
if (x == root) T[root = l + r].p = 0; else {p = T[x].p; if (x == T[p].l) slc(p, l + r); else src(p, l + r); while(p) {upd(p); p = T[p].p;}}
}
}
}
long long h(int x)
{
return F[Q[x]] + a[Q[x + 1]];
}
void solve()
{
F[0] = 0; front = 0; rear = 0; Q[0] = 0;
re1(i, n) {
for (; front<=rear && Q[front]<b[i];) {if (front < rear) del(find(h(front))); front++;}
for (; front<=rear && a[Q[rear]]<=a[i];) {if (front < rear) del(find(h(rear - 1))); rear--;}
Q[++rear] = i; if (front < rear) ins(h(rear - 1));
if (root) F[i] = T[Find_Kth(1)].v; else F[i] = INF;
if (F[b[i]] + MAX[i] < F[i]) F[i] = F[b[i]] + MAX[i];
}
res = F[n];
}
void pri()
{
cout << res << endl;
}
int main()
{
init();
prepare();
if (!res) solve();
pri();
return 0;
}
]]>
錛?錛夊尯闂存搷浣滐細浣跨敤綰挎鏍戯紱
錛?錛変慨鏀瑰鹼紙鍏跺疄鏄厛鍒犻櫎鍐嶆彃鍏ワ級鍜屾壘絎琄灝忥細浣跨敤騫寵 鏍戯紱
鐜板湪榪欎袱縐嶆搷浣滈兘鏈夛紝搴旇浣跨敤綰挎鏍?騫寵 鏍?/strong>錛?br />鍑嗙‘鏉ヨ鏄嚎孌墊爲濂楀鉤琛℃爲錛屽嵆瀵瑰師搴忓垪寤虹珛涓媯電嚎孌墊爲錛屽叾涓殑姣忎釜緇撶偣鍐呭涓媯靛璇ョ粨鐐圭杈栧尯闂村唴鐨勫鉤琛℃爲銆?br />
<1>緇撶偣綾誨瀷錛堢粨鏋勶級錛?
int l, r, mid, lch, rch, rt;
} T0[MAXN0];
struct SBT_node {
int v, l, r, p, sz0, sz, mul;
} T[MAXN];
<2>寤烘爲錛?br />寤烘爲鏄嚎孌墊爲鍜屽鉤琛℃爲涓璧峰緩銆傚湪寤虹珛綰挎鏍戠粨鐐圭殑鏃跺欙紝鍏堝緩绔嬩竴媯電┖鐨勫鉤琛℃爲錛坮t鍩熺疆0錛夛紝鐒跺悗鍐嶅湪騫寵 鏍戦噷闈㈤愪釜鎻掑叆璇ョ粨鐐圭杈栧尯闂村唴鐨勬墍鏈夊厓绱犲嵆鍙紱
<3>淇敼錛?br />淇敼鎿嶄綔瑕佹敞鎰忥細濡傛灉瑕佸皢A[x]錛圓涓哄師搴忓垪錛夌殑鍊間慨鏀逛負y錛屽垯闇瑕佽嚜欏跺悜涓嬮亶鍘嗘暣媯電嚎孌墊爲錛屽皢鎵鏈夊寘鍚簡A[x]鐨勭粨鐐瑰唴鐨勫鉤琛℃爲鍏ㄩ儴鎵ц“鍒犻櫎v=A[x]錛堣繖涓彲浠ラ氳繃鐪熸緇存姢涓涓簭鍒楀緱鍒幫級錛屽啀鎻掑叆y”鐨勬搷浣滐紱
<4>鎵懼尯闂寸K灝忥細
榪欎釜鎿嶄綔鏋佸叾楹葷儲銆傞渶瑕佸熷姪浜屽垎銆?br />璁捐鍦ㄥ尯闂碵l, r]涓壘鍒扮K灝忋傞鍏堝皢[l, r]鎷嗗垎鎴愯嫢騫蹭釜綰挎鏍戠粨鐐癸紝鐒跺悗浜屽垎涓涓紉錛屽湪榪欎簺緇撶偣鐨勫鉤琛℃爲涓壘鍒皒鐨剅ank錛堣繖閲岀殑rank鎸囧鉤琛℃爲涓湁澶氬皯涓兼瘮x灝忥紝涓嶉渶瑕佸姞1錛夛紝鍔犺搗鏉ワ紝鏈鍚庡啀鍔?錛屽氨鏄痻鍦╗l, r]涓殑鎬誨悕嬈°傞棶棰樻槸錛岃[l..r]涓K灝忕殑鏁頒負v1錛岀(K+1)灝忕殑鏁頒負v2錛堝鏋滀笉瀛樺湪鐨勮瘽錛寁2=+∞錛夛紝鍒橻v1, v2)鍐呯殑鏁伴兘鏄?#8220;絎琄灝?#8221;鐨勩傚洜姝わ紝涓嶈兘浜屽垎鏁板瓧錛岃屽簲璇ヤ簩鍒嗗厓绱犮傝S[i]涓哄師搴忓垪涓i灝忕殑鏁幫紝浜屽垎i錛岀劧鍚庡湪鏍圭粨鐐圭殑騫寵 鏍戜腑鎵懼埌絎琲灝忕殑鍗充負S[i]錛屽啀姹傚叾鍚嶆錛岃繖鏍風洿鍒版壘鍒版誨悕嬈′負K鐨勫厓绱犱負姝€傞棶棰樿繕娌″畬錛屽簭鍒椾腑鍙兘鏈夊厓绱犵殑鍊肩浉鍚岋紝榪欐椂鍙兘姘歌繙涔熸壘涓嶅埌絎琄灝忕殑錛堟瘮濡傚簭鍒? 2 3 3 3 4 5錛孠=4錛岃嫢“搴忓垪涓瘮x灝忕殑鍏冪礌鎬繪暟+1”涓簒鐨勫悕嬈★紝鍒欐案榪滀篃鎵句笉鍒扮4灝忕殑錛夛紝鍥犳錛岃嫢榪欐牱姹傚嚭鐨?#8220;鍚嶆”灝忎簬絳変簬K錛岄兘搴旇灝嗕笅涓嬈$殑宸﹁竟鐣岃涓簃id鑰屼笉鏄?mid+1)錛岃?#8220;鍚嶆”澶т簬K鏃訛紝璇ュ厓绱犺偗瀹氫笉鏄K灝忕殑錛屾墍浠ヤ笅涓嬈″彸杈圭晫璁句負(mid-1)銆?br />
浠g爜錛堟湰鏈烘祴鏈鐚ョ悙鏁版嵁4s浠ュ唴錛屼氦鍒癦JU涓奣LE錛屼笉鐭ヤ負浠涔堬紝紲炵妵鎸囩偣涓涓嬶紝3x錛夛細
#include <stdio.h>
using namespace std;
#define re(i, n) for (int i=0; i<n; i++)
#define re3(i, l, r) for (int i=l; i<=r; i++)
const int MAXN0 = 110000, MAXN = 930000, INF = ~0U >> 2;
struct seg_node {
int l, r, mid, lch, rch, rt;
} T0[MAXN0];
struct SBT_node {
int v, l, r, p, sz0, sz, mul;
} T[MAXN];
int No0, No, n, root, rt0, a[MAXN0 >> 1], b[MAXN0 >> 1], l1, r1, len;
void slc(int _p, int _c)
{
T[_p].l = _c; T[_c].p = _p;
}
void src(int _p, int _c)
{
T[_p].r = _c; T[_c].p = _p;
}
void upd(int x)
{
T[x].sz0 = T[T[x].l].sz0 + T[T[x].r].sz0 + T[x].mul;
T[x].sz = T[T[x].l].sz + T[T[x].r].sz + 1;
}
void lrot(int x)
{
int y = T[x].p; if (y == rt0) T[rt0 = x].p = 0; else {int p = T[y].p; if (y == T[p].l) slc(p, x); else src(p, x);}
src(y, T[x].l); slc(x, y); T[x].sz0 = T[y].sz0; T[x].sz = T[y].sz; upd(y);
}
void rrot(int x)
{
int y = T[x].p; if (y == rt0) T[rt0 = x].p = 0; else {int p = T[y].p; if (y == T[p].l) slc(p, x); else src(p, x);}
slc(y, T[x].r); src(x, y); T[x].sz0 = T[y].sz0; T[x].sz = T[y].sz; upd(y);
}
void maintain(int x, bool ff)
{
int z;
if (ff) {
if (T[T[T[x].r].r].sz > T[T[x].l].sz) {z = T[x].r; lrot(z);}
else if (T[T[T[x].r].l].sz > T[T[x].l].sz) {z = T[T[x].r].l; rrot(z); lrot(z);} else return;
} else {
if (T[T[T[x].l].l].sz > T[T[x].r].sz) {z = T[x].l; rrot(z);}
else if (T[T[T[x].l].r].sz > T[T[x].r].sz) {z = T[T[x].l].r; lrot(z); rrot(z);} else return;
}
maintain(T[z].l, 0); maintain(T[z].r, 1); maintain(z, 0); maintain(z, 1);
}
int find(int _v)
{
int i = rt0, v0;
while (i) {
v0 = T[i].v;
if (_v == v0) return i; else if (_v < v0) i = T[i].l; else i = T[i].r;
}
return 0;
}
void ins(int _v)
{
if (!rt0) {
T[++No].v = _v; T[No].l = T[No].r = T[No].p = 0; T[No].sz0 = T[No].sz = T[No].mul = 1; rt0 = No;
} else {
int i = rt0, j, v0;
while (1) {
T[i].sz0++; v0 = T[i].v;
if (_v == v0) {T[i].mul++; return;} else if (_v < v0) j = T[i].l; else j = T[i].r;
if (j) i = j; else break;
}
T[++No].v = _v; T[No].l = T[No].r = 0; T[No].sz0 = T[No].sz = T[No].mul = 1; if (_v < v0) slc(i, No); else src(i, No);
while (i) {T[i].sz++; maintain(i, _v > T[i].v); i = T[i].p;}
}
}
void del(int x)
{
if (T[x].mul > 1) {
T[x].mul--;
while (x) {T[x].sz0--; x = T[x].p;}
} else {
int l = T[x].l, r = T[x].r;
if (!l || !r) {
if (x == rt0) T[rt0 = l + r].p = 0; else {
int p = T[x].p; if (x == T[p].l) slc(p, l + r); else src(p, l + r);
while (p) {T[p].sz0--; T[p].sz--; p = T[p].p;}
}
} else {
int i = l, j;
while (j = T[i].r) i = j;
T[x].v = T[i].v; T[x].mul = T[i].mul; int p = T[i].p; if (i == T[p].l) slc(p, T[i].l); else src(p, T[i].l);
while (p) {upd(p); p = T[p].p;}
}
}
}
int Find_Kth(int K)
{
int i = rt0, s0, m0;
while (i) {
s0 = T[T[i].l].sz0; m0 = T[i].mul;
if (K <= s0) i = T[i].l; else if (K <= s0 + m0) return T[i].v; else {K -= s0 + m0; i = T[i].r;}
}
}
int rank(int _v)
{
int i = rt0, tot = 0, v0;
while (i) {
v0 = T[i].v;
if (_v == v0) {tot += T[T[i].l].sz0; return tot;} else if (_v < v0) i = T[i].l; else {tot += T[T[i].l].sz0 + T[i].mul; i = T[i].r;}
}
return tot;
}
int mkt(int l, int r)
{
T0[++No0].l = l; T0[No0].r = r; int mid = l + r >> 1; T0[No0].mid = mid; rt0 = 0;
re3(i, l, r) ins(a[i]); T0[No0].rt = rt0;
if (l < r) {int No00 = No0; T0[No00].lch = mkt(l, mid); T0[No00].rch = mkt(mid + 1, r); return No00;} else {T0[No0].lch = T0[No0].rch = 0; return No0;}
}
void fs(int x)
{
if (x) {
int l0 = T0[x].l, r0 = T0[x].r;
if (l0 >= l1 && r0 <= r1) b[len++] = T0[x].rt; else if (l0 > r1 || r0 < l1) return; else {fs(T0[x].lch); fs(T0[x].rch);}
}
}
void C(int x, int _v)
{
int i = root, l0, r0, mid0, v0 = a[x], N;
while (i) {
l0 = T0[i].l; r0 = T0[i].r; mid0 = T0[i].mid; rt0 = T0[i].rt;
N = find(v0); del(N); ins(_v); T0[i].rt = rt0;
if (x <= mid0) i = T0[i].lch; else i = T0[i].rch;
}
a[x] = _v;
}
int Q(int K)
{
len = 0; fs(root);
int ls = 1, rs = n, mids, midv, tot;
while (ls < rs) {
mids = ls + rs + 1 >> 1; rt0 = T0[root].rt; midv = Find_Kth(mids);
tot = 1; re(i, len) {rt0 = b[i]; tot += rank(midv);}
if (tot <= K) ls = mids; else rs = mids - 1;
}
rt0 = T0[root].rt; return Find_Kth(ls);
}
int main()
{
int tests, m, x, y, K;
char ch;
scanf("%d", &tests);
re(testno, tests) {
scanf("%d%d", &n, &m); No0 = No = 0;
re(i, n) scanf("%d", &a[i]); ch = getchar();
root = mkt(0, n - 1);
re(i, m) {
ch = getchar();
if (ch == 'C') {
scanf("%d%d%*c", &x, &y);
C(--x, y);
} else {
scanf("%d%d%d%*c", &l1, &r1, &K);
l1--; r1--; printf("%d\n", Q(K));
}
}
}
return 0;
}
]]>
錛?錛塖uperMemo錛?a title="PKU3580" >PKU3580錛?br />鏈鐨?涓搷浣滀腑錛宎dd銆乺everse銆乮nsert銆乨elete銆乵in閮戒笉闅炬悶錛岃宺evolve鎿嶄綔闇瑕佹秹鍙婂埌鍖洪棿浜ゆ崲銆?br />鍙互鍙戠幇錛屾墍璋撶殑鏃嬭漿鍏跺疄灝辨槸浜ゆ崲涓や釜鐩擱偦鍖洪棿錛岃繖瀵逛簬鍔熻兘鏋佸己鐨凷play Tree鏉ヨ鏍規(guī)湰涓嶉毦鎼炪?br />璁捐繖涓や釜鐩擱偦鍖洪棿涓篬x, y]涓嶽y+1, z]錛屽亣璁懼畠浠潎闈炵┖錛堜篃灝辨槸x<=y<z錛屽洜涓鴻嫢鍏朵腑鑷沖皯鏈変竴涓尯闂存槸絀哄尯闂達紝鍒欎氦鎹㈡病鏈夋剰涔夛級錛屽厛鎵懼埌鏍戜腑x鐨勫墠瓚婸涓巣鐨勫悗緇錛堣繖閲寈銆亃絳夋寚鐨勯兘鏄搴旂殑緇撶偣錛屼笅鍚岋級錛屽皢P浼稿睍鍒版牴銆佸皢S浼稿睍鍒版牴鐨勫彸瀛愮粨鐐瑰錛屽垯S鐨勫乏瀛愭爲灝辮〃紺哄尯闂碵x, z]銆傜劧鍚庯紝璁維鐨勫乏瀛愭爲鐨勬牴緇撶偣錛堜篃灝辨槸S鐨勫乏瀛愮粨鐐癸級涓篘錛屽湪榪欐5瀛愭爲涓壘鍒扮1灝忕殑緇撶偣P0涓庣(y-x+2)灝忕殑緇撶偣S0錛堣繖闇瑕佹秹鍙婂埌鎵懼瓙鏍戝唴絎琄灝忕殑鎿嶄綔錛屽彧瑕佹妸鎵炬暣媯墊爲絎琄灝忕殑鎿嶄綔鐨剅oot鏀逛負N鍗沖彲錛夛紝瀹冧滑鍒嗗埆琛ㄧずx涓?y+1)錛岃繖鏍峰皢P0浼稿睍鍒癗澶勶紝灝哠0浼稿睍鍒癗鐨勫彸瀛愮粨鐐瑰錛屾樉鐒禤0鏃犲乏瀛愭爲錛孲0鐨勫乏瀛愭爲T1琛ㄧず鍖洪棿[x+1, y]錛孲0鐨勫彸瀛愭爲T2琛ㄧず鍖洪棿[y+2, z]銆傜劧鍚庯紝鍏堝皢S0浠嶱0鐨勫彸瀛愮粨鐐圭Щ鍔ㄥ埌P0鐨勫乏瀛愮粨鐐癸紝鍐嶅皢T1浣滀負P0鐨勫彸瀛愭爲錛堟敞鎰忕Щ鍔ㄦ槸涓ゆ錛氭彃鍏ュ拰鍒犻櫎錛夈傝繖鏍鋒暣媯靛瓙鏍戠殑涓簭閬嶅巻緇撴灉鍙樻垚浜哠0->T2->P0->T1錛屼篃灝辨槸[y+1, z]∪[x, y]銆?br />鍙﹀鏈鐨勬爣璁版湁鐐歸毦鎼烇紝鍙渶娉ㄦ剰rev鏄嗗悜鏍囪錛屼互鍙婃煡鎵句笌dm鍏卞瓨灝辮浜嗐?br />浠g爜
錛?錛塒lay with Chain(HDU3487)
榪欎釜綾蟲湁紲為┈濂借鐨勶紝閲岄潰鐨勬搷浣滃湪SuperMemo閲岄兘鏈夛紱
浠g爜
錛?錛?a title="AHOI2006 鏂囨湰緙栬緫鍣?editor)" >AHOI2006 鏂囨湰緙栬緫鍣?editor)
榪欓鍦ㄨ繖涓綾婚閲岄潰綆楁按鐨勩傚浜庡厜鏍囷紝鍙鐢ㄤ竴涓兼潵緇存姢灝辮浜嗐?br />鍙﹀娉ㄦ剰鏈鏋佷負鐚ョ悙鐨?鐐癸紙棰樼洰涓背鏈夎鏄庯級錛氫竴鏄渶鍒濈殑鏂囨湰騫朵笉鏄┖鐨勶紝鑰屾槸鏈変竴涓┖鏍鹼紱浜屾槸鎵цGET鎿嶄綔鏃跺厜鏍囧彲鑳戒綅浜庢枃鏈湯灝撅紝姝ゆ椂搴旇緭鍑虹┖鏍鹼紱
浠g爜
錛?錛塇FTSC2011 楂樼簿搴﹁綆楀櫒(apc)錛岄鐩榪欎釜甯栧瓙錛?br />榪欓鍙嶆槧鍑轟簡涓涓緢鍥х殑闂錛氭湁浜涗俊鎭細琚玶ev鏁翠綋鐮村潖銆?br />鏈涓殑鎿嶄綔閮芥槸甯歌鎿嶄綔錛屼絾鏄湰棰樻墍闇瑕佺淮鎶ょ殑淇℃伅鍗翠笉鏄偅涔堝鏄撶淮鎶ゃ傛湰棰樿姹傜淮鎶や竴媯靛瓙鏍戜腑鎵鏈夌粨鐐規(guī)墍琛ㄧず鐨勫厓绱犲簭鍒楋紙涓簭閬嶅巻緇撴灉錛夋ā涓涓寚瀹氱殑M鐨勫箋傝F[i]涓篟^i mod M鐨勫鹼紙榪欓噷R鏄繘鍒訛紝涔熷氨鏄鐩腑鐨凨錛夛紝鍒欐湁錛?br />T[x].mod = (T[T[x].c[0]].mod * F[T[T[x].c[1]].sz + 1] + T[x].v * F[T[T[x].c[1]].sz] + T[T[x].c[1]].mod) % M;
榪欎釜寮忓瓙鍏跺疄鏄緢濂界悊瑙g殑銆?br />鍏抽敭鏄紝鏈鐨勭尌鐞愪箣澶勫茍涓嶅湪姝ゃ傛敞鎰忔湰棰樼殑rev鎿嶄綔錛屽畠浼氭暣浣撴敼鍙樻爲涓墍鏈夌粨鐐規(guī)墍璁板綍鐨刴od鍊鹼紝榪欐椂錛屽鏋滃啀鐢ㄤ笂闈㈣繖涓紡瀛愭潵緇存姢T[x].mod錛屽氨浼氬嚭閿欙紝鍥犱負姝ゆ椂寮曠敤鍒扮殑T[T[x].c[0]].mod鍜孴[T[x].c[1]].mod閮芥槸榪囨椂鐨勩傝В鍐寵繖涓闂鍙湁涓縐嶆柟娉曪細璁板綍“閫唌od”(rmod)錛屾剰鎬濇槸灝嗘暣涓厓绱犲簭鍒楀弽杞悗鐨刴od錛屽嵆錛?br />T[x].rmod = (T[T[x].c[1]].rmod * F[T[T[x].c[0]].sz + 1] + T[x].v * F[T[T[x].c[0]].sz] + T[T[x].c[0]].rmod) % M;
榪欐牱錛屽湪鍙嶈漿鏌愬簭鍒楃殑鏃跺欙紝鐩存帴灝嗘牴緇撶偣鐨刴od鍊煎拰rmod鍊間氦鎹㈠氨琛屼簡銆?br />鍍弇od榪欐牱浼氳鍙嶈漿鎿嶄綔鏁翠綋鐮村潖鐨勪俊鎭繕鏈夊緢澶氾紝姣斿NOI2005 sequence閲岄潰鐨刲max鍜宺max銆傚鏋滅湡鐨勯亣鍒拌繖綾諱俊鎭紝鍙湁閲囩敤涓婇潰鐨勬柟娉曘?br />鍙﹀錛屾湰棰樼6銆?銆?0涓偣鏈夎銆?br />浠g爜
鐜板湪Splay Tree宸笉澶氬紕瀹屼簡錛屾帴涓嬫潵榪樻湁N澶氱煡鍚嶇殑銆佷笉鐭ュ悕鐨勯珮綰ф暟鎹粨鏋?#8230;…鏃墮棿MS鏈変簺涓嶅鐢ㄤ簡鍥?#8230;…
]]>
錛?錛夊尯闂存搷浣滐紙涓庣嚎孌墊爲鐨勭粨鍚堬級錛氭爣璁幫紙鑷《鍚戜笅錛夛紱
錛?錛夊尯闂存搷浣滐紙涓庣嚎孌墊爲鐨勭粨鍚堬級錛氭渶澶у箋佹誨拰絳夎嚜搴曞悜涓婄淮鎶ょ殑淇℃伅錛?br />錛?錛変竴浜涚壒鍒尌鐞愮殑鎿嶄綔錛堟瘮濡侾KU3580鐨剅evolve錛夛紱
銆愪富瑕佸嚱鏁板強鍏舵槗鐤電偣銆?br />錛?錛塿oid sc(int _p, int _c, bool _d);
灝哶p鐨刜d瀛愮粨鐐癸紙0宸?鍙籌級緗負_c錛岃繖涓氨涓夊彞璇濓紝搴旇涓嶄細鎼炵柕錛?br />錛?錛塿oid upd(int x);
鏇存柊x璁板綍鐨勪竴浜涗俊鎭紙鑷簳鍚戜笂緇存姢鐨勪俊鎭紝鍖呮嫭澶у皬鍩焥z錛夛紝榪欎釜錛屾湁鍑犱釜淇℃伅灝卞啓鍑犲彞璇濆氨琛屼簡錛屼笉鏄撴悶鐤碉紱
錛?錛塿oid rot(int x);
鏃嬭漿鎿嶄綔錛屽皢x鏃嬭漿鍒板叾鐖剁粨鐐圭殑浣嶇疆銆傝繖涓嚱鏁頒腑鏈変袱涓槗鐤電偣錛氫竴鏄嫢x鐨勭埗緇撶偣涓烘牴錛屽垯闇瑕佸湪鏃嬭漿鍚庡皢鏍圭疆涓簒錛屼笖灝唜鐨勭埗緇撶偣緗負0錛堢壒鍒敞鎰忚繖涓級錛涗簩鏄嫢x鐨勭埗緇撶偣涓嶄負鏍癸紝鍒欓渶瑕佸皢x鐨勭埗緇撶偣鐨勭埗緇撶偣鐨勫搴斿瓙緇撶偣錛堝師鏉ユ槸x鐨勭埗緇撶偣鐨勯偅涓級緗負x錛涘彟澶栨棆杞畬鎴愬悗鍒繕浜嗘洿鏂幫紱
錛?錛塿oid splay(int x, int r);
浼稿睍鎿嶄綔錛屽皢x浼稿睍鍒皉鐨勫瓙緇撶偣澶勶紝榪欎釜鎿嶄綔鏄渶鏍稿績鐨勬搷浣滐紝鍙璁頒綇浜嗚繃紼嬶紝涓攔ot涓嶆悶鐤碉紝榪欎釜涔熷氨涓嶄細鎼炵柕錛?br />錛?錛塿oid dm(int x);
瀵逛簬鏈夋爣璁扮殑緇撶偣鐨勪笅鏀炬爣璁版搷浣滐紝鏋佹槗鐤碉紒
棣栧厛錛屽浜庝換浣曠粨鐐癸紝鏍囪涓鎵撲笂灝卞繀欏葷珛鍗崇敓鏁堬紝鍥犳闄や簡灝唜鐨勬爣璁板彇娑堛亁鐨勪袱涓瓙緇撶偣錛堝鏋滃瓨鍦ㄧ殑璇濓級鎵撲笂鏍囪澶栵紝榪樿鏇存柊涓や釜瀛愮粨鐐圭殑涓浜涘煙錛堝綋鐒惰繖閲屾洿鏂板崈涓囦笉鑳界敤upd鏇存柊錛夛紱
鍏舵錛岃鎼炴竻妤歺鐨勬瘡涓涓爣璁扮殑綾誨瀷錛屾槸鍙犲姞鍨嬫爣璁幫紙濡傛暣浣撳姞涓婃煇涓涓暟鐨勬爣璁幫級銆佽鐩栧瀷鏍囪錛堝鏁翠綋緗負鏌愪竴涓暟鐨勬爣璁幫級榪樻槸閫嗗悜鏍囪錛堝鏄惁緲昏漿榪囩殑鏍囪錛屽洜涓虹炕杞袱嬈$瓑浜庢病杞級錛岀劧鍚庡湪涓嬫斁鏍囪鐨勬椂鍊欐敞鎰忓啓娉曪紙鍥犱負x鐨勫瓙緇撶偣鍘熸潵鍙兘涔熸湁鏍囪錛屾鏃跺彧鏈夎鐩栧瀷鏍囪闇瑕佸皢x鐨勫瓙緇撶偣鐨勫師鏉ョ殑鏍囪瑕嗙洊鎺夛紝瀵逛簬鍙犲姞鍨嬫爣璁幫紝搴斾負鍔犳硶榪愮畻錛屽浜庨嗗悜鏍囪錛屽簲涓哄彇鍙嶆搷浣滐紝榪樻湁鍏跺畠綾誨瀷鐨勬爣璁板垎鍒鐞嗭級錛?br />鏈鍚庤繕鏈変竴鐐癸紝灝辨槸x鐨勫乏瀛愮粨鐐規(guī)垨鍙沖瓙緇撶偣鍙兘涓嶅瓨鍦紙0錛夛紝姝ゆ椂灝變笉鑳藉榪欓噷鐨?鍙風粨鐐逛笅鏀炬爣璁般?br />錛?錛塱nt Find_Kth(int x, int K);
鍦ㄤ互緇撶偣x涓烘牴鐨勫瓙鏍戜腑鎵劇K灝忕殑緇撶偣錛岃繑鍥炵粨鐐圭紪鍙鳳紱鑻ョ渷鐣錛岄粯璁=root錛堝嵆鍦ㄦ暣媯墊爲涓壘錛夛紱
榪欎釜涓鑸笉浼氭悶鐤碉紝娉ㄦ剰涓や釜鍦版柟鍗沖彲錛氫竴鏄湁mul鍩熺殑鏃跺欓渶瑕佽冭檻mul鍩燂紝浜屾槸緇撶偣濡傛灉鏈夋爣璁幫紝闇瑕佸湪鎵劇殑鏃跺欎笅鏀炬爣璁般傦紙鍑℃槸鏌ユ壘鎿嶄綔錛屽寘鎷彃鍏ユ柊緇撶偣鏃剁殑鏌ユ壘錛屽湪鏌ユ壘榪囩▼涓繀欏諱笉鏂笅鏀炬爣璁幫紝鍥犱負鏌ユ壘涔嬪悗寰堝彲鑳藉氨瑕佷幾灞曪級錛?br />錛?錛塿oid ins(int _v);
void ins(int x, int _v)
鎻掑叆涓涓間負_v鐨勭粨鐐廣傚墠鑰呮槸鏅氭彃鍏ワ紝鍚庤呮槸鐢⊿play Tree澶勭悊搴忓垪錛堝綋綰挎鏍戠敤錛夋椂鐨勬彃鍏ワ紝琛ㄧず鍦ㄧx灝忕殑緇撶偣鍚庢彃鍏ワ紱
鍓嶈呮敞鎰忔湁涓夌鎯呭喌錛氭爲涓虹┖錛涙爲闈炵┖涓斿間負_v鐨勭粨鐐逛笉瀛樺湪錛涙爲闈炵┖涓斿間負_v鐨勭粨鐐瑰凡瀛樺湪錛?br />鍚庤呴渶瑕佹敞鎰忥紝鍦ㄥ皢絎瑇灝忕殑緇撶偣浼稿睍鍒版牴錛屽皢絎?x+1)灝忕殑緇撶偣浼稿睍鍒版牴鐨勫彸瀛愮粨鐐癸紝鍐嶆彃鍏ュ悗錛岄渶瑕乽pd涓婅堪涓や釜緇撶偣錛堟敞鎰弖pd欏哄簭錛夛紱
錛?錛塿oid del(int x);
灝嗙粨鐐箈鍒犻櫎銆傝繖涓竴鑸笉浼氭悶鐤碉紝鍞竴瑕佹敞鎰忕殑涓鐐規(guī)槸鍒犻櫎鍚庣殑upd錛?br />錛?錛夋墦鏍囪鎿嶄綔錛坅dd銆乺everse銆乵akesame絳夛級錛?br />鍏跺疄鎵撴爣璁版搷浣滅殑浠g爜閲忔槸寰堝皯鐨勶紝鍏抽敭灝辨槸瀵逛簬涓嶅悓鏍囪瑕佸垎鍒鐞嗭紝鍚岋紙5錛夛紱
錛?0錛夊悇縐嶈闂搷浣滐細
榪欎釜鐩存帴璋冨嚭鐩稿簲鐨勫煙鍗沖彲錛屽嚑涔庝笉鍙兘鎼炵柕錛?br />錛?1錛夋瀬鍏剁尌鐞愮殑鎿嶄綔錛坮evolve絳夛級錛?br />榪欎釜灞炰簬鏈鏄撶柕鐨勬搷浣滐紙鍚﹀垯灝變綋鐜頒笉鍑哄叾鐚ョ悙浜嗭級錛?br />棣栧厛瑕佹悶娓呮榪欎釜鎿嶄綔鐨勫叿浣撹繃紼嬶紝涓嶈榪炲叿浣撹繃紼嬮兘鎼炵柕浜嗭紝榪欐牱鍐欏嚭鏉ョ殑浠g爜鑲畾鏄柕鐨勶紱
鐒跺悗錛屾敞鎰忎竴浜涢潪甯哥尌鐞愮殑緇嗚妭闂錛堝緢澶氭椂鍊欙紝鏈矙鑼墮兘鏄牻鍦ㄧ粏鑺備笂鐨勶級錛?br />鍙﹀錛岃繖浜涙搷浣滀腑涓鑸兘浼氬嚭鐜板嬈′幾灞曪紝鍒繕浜嗕幾灞曞悗鐨剈pd錛?br />錛?2錛夊叾瀹冩槗鐤電偣錛?br />[1]“縐誨姩”鏄敱“鎻掑叆”鍜?#8220;鍒犻櫎”涓ら儴鍒嗙粍鎴愮殑錛屽洜姝ゅ嚒鏄秹鍙婂埌“縐誨姩”綾葷殑鎿嶄綔錛堝灝嗘煇媯靛瓙鏍戞垨鏌愪釜緇撶偣縐誨姩鍒板彟涓涓綅緗瓑錛夛紝蹇呴』瑕佸悓鏃跺嚭鐜?#8220;鎻掑叆”鍜?#8220;鍒犻櫎”錛岃屼笉鑳藉彧鎻掑叆涓嶅垹闄わ紱
[2]娉ㄦ剰媯鏌ヤ富鍑芥暟main()涓槸鍚︽湁鎼炵柕鐨勫湴鏂癸紱
鏄撶柕鐐逛篃灝辮繖涔堝浜嗭紝涓嬮潰鏄皟璇曟妧宸э細
銆怱play Tree璋冭瘯鎶宸с?br />錛?錛夊厛鐢ㄦ牱渚嬭皟璇曪紝淇濊瘉鏍蜂緥鑳藉閫氳繃錛堟敞鎰忥紝鏍蜂緥涓繀欏誨寘鍚墍鏈夐鐩腑緇欏嚭鐨勬搷浣滐紝濡傛灉涓嶆槸榪欐牱錛岄偅鍦ㄨ皟璇曞畬鏍蜂緥鍚庤繕瑕佸姞涓緇勫寘鍚墍鏈夐鐩腑緇欏嚭鐨勬搷浣滅殑灝忔暟鎹級錛?br />錛?錛夌劧鍚庣敤mkdt閫犲ぇ鏁版嵁錛屼竴鑸鉤琛℃爲鎿嶄綔棰樼殑鍚堟硶鏁版嵁閮戒笉闅鵑狅紝鍙娉ㄦ剰鍒秺鐣屽氨琛屼簡錛?br />錛?錛夊湪璋冭瘯榪囩▼涓簲涓嶆柇灝戦噺澧炲ぇ鏁版嵁瑙勬ā錛屽洜涓哄湪鑳芥壘鍑洪棶棰樼殑鎯呭喌涓嬶紝鏁版嵁瑙勬ā瓚婂皬瓚婂ソ錛?br />錛?錛夊鏋滆皟璇曡繃紼嬩腑鍙戠幇姝誨驚鐜垨鑰匯E錛?br />[1]棣栧厛杈撳嚭姣忎釜鎿嶄綔錛屾壘鍑烘槸鍦ㄥ摢涓搷浣滃鍑轟簡闂錛?br />[2]榪涘叆璇ユ搷浣滃唴閮ㄦ鏌ワ紝涔熷氨鏄妸璇ユ搷浣滅殑浠g爜璇諱竴閬嶏紝涓鑸兘鑳芥壘鍑洪棶棰橈紱
[3]濡傛灉鎵句笉鍑洪棶棰橈紝鍙互榪涘叆璇ユ搷浣滃唴閮ㄨ窡韙鏌ワ紱
[4]濡傛灉璺熻釜媯鏌ヤ粛鐒舵病鎵懼嚭闂錛岄偅鍙兘鏄鎿嶄綔鏄鐨勶紝鑰屽叾瀹冩搷浣滃嚭浜嗛棶棰橈紝姝ゆ椂鍙互寮勪竴涓獀st錛屾妸鏁存5鏍戦亶鍘嗕竴涓嬶紝鎵懼嚭鐪熸鍑洪棶棰樼殑鎿嶄綔錛岃漿[2]錛?br />錛?錛夋帓闄や簡姝誨驚鐜垨RE鍚庯紝鎺ヤ笅鏉ュ氨鏄鏌ヨ緭鍑虹粨鏋滄槸鍚︽紜簡錛?br />[1]瀵逛簬灝忚妯℃暟鎹彲浜哄伐璁$畻媯鏌ワ紝瀵逛簬杈冨ぇ瑙勬ā鏁版嵁鍒欏繀欏婚噰鐢ㄥ鐓ф柟娉曪紝鍗沖紕涓涓ā鎷熸硶鐨勪唬鐮侊紝淇濊瘉璇ヤ唬鐮佹紜紝鐒跺悗榪涜瀵圭収錛?br />[2]濡傛灉鍙戠幇鍔犲叆閬嶅巻鏃訛紝緇撴灉姝g‘錛屼絾鍘繪帀閬嶅巻鍚庣粨鏋滀笉姝g‘錛屽垯琛ㄦ槑鏄鐞嗙粨鐐規(guī)爣璁扮殑鏃跺欏嚭浜嗛棶棰橈紙鍥犱負鍦ㄩ亶鍘嗚繃紼嬩腑闇瑕佷笅鏀炬爣璁幫級錛岃繘鍏m鎴栧姞鏍囪鎿嶄綔涓鏌ュ嵆鍙紱
[3]鍏跺畠鎯呭喌涓嬶紝鍙互鍦ㄩ亶鍘嗕腑杈撳嚭鏁翠釜搴忓垪錛堟垨鏁存5鏍戯級錛岃繘琛屽鐓э紝鎵懼嚭闂鎵鍦紱
[4]濡傛灉鏁版嵁榪囧ぇ錛屾搷浣滆繃澶氾紝浜哄伐鍒嗘瀽鏃墮棿杈冮暱錛屽氨鍙兘閲囩敤璇諱唬鐮佺殑鏂瑰紡媯鏌ヤ簡錛?br />錛?錛夋渶鍚庯紝鐢╩kdt閫犱竴涓渶澶ц妯$殑鏁版嵁錛屾鏌ユ槸鍚LE銆佹槸鍚﹁秺鐣岋紙鏁扮粍鏄惁寮灝忥級錛?br />濡傛灉浠ヤ笂鍚勭偣鍏ㄩ儴閫氳繃錛屽氨鍙互瀹e竷AC浜嗐?br />
]]>
Splay Tree涔嬫墍浠ュ彲浠ュ綋綰挎鏍戠敤錛屾槸鍥犱負瀹冨彲浠ユ敮鎸佷竴涓簭鍒楋紝鐒跺悗鐢?#8220;宸︾鍓嶈秼浼稿睍鍒版牴錛屽彸绔悗緇т幾灞曞埌鏍圭殑鍙沖瓙緇撶偣錛屽彇鏍圭殑鍙沖瓙緇撶偣鐨勫乏瀛愮粨鐐?#8221;榪欑浼稿睍鏂規(guī)硶錛屽涓涓簭鍒椾腑鐨勪竴鏁存榪涜鏁翠綋鎿嶄綔銆傜敱浜庤闃叉鍑虹幇鍓嶈秼鎴栧悗緇т笉瀛樺湪鐨勬儏鍐碉紝闇瑕佸湪榪欎釜搴忓垪鐨勪袱绔姞鍏ヤ袱涓竟鐣岀粨鐐癸紝瑕佹眰鍏跺間笉鑳藉獎鍝嶅埌緇撶偣鍚勭璁拌澆淇℃伅鐨勭淮鎶わ紙澶氬彇0銆?#8734;鎴?∞錛夈傝繖涓や釜杈圭晫緇撶偣鍦ㄦ爲涓案榪滃瓨鍦紝涓嶄細琚垹闄ゃ?br />
錛?錛夌粨鐐圭殑寮曠敤錛?br />鍦ㄥ綋綰挎鏍戠敤鐨凷play Tree涓紝鐪熸鐨勫叧閿瓧鏄笅鏍囪屼笉鏄鹼紝鍥犳錛?#8220;搴忓垪涓i涓粨鐐?#8221;瀹為檯涓婂搴旂殑鏄?#8220;鏍戜腑絎?i+1)灝忕殑緇撶偣”錛堝洜涓哄乏杈硅繕鏈変竴涓竟鐣岀粨鐐癸級錛岃繖灝辮鏄庡湪瀵圭粨鐐瑰紩鐢ㄦ椂闇瑕佹壘絎琄灝忕殑鎿嶄綔銆傚洜姝わ紝涓嬮潰鐨?#8220;緇撶偣x”鎸囩殑鏄?#8220;鏍戜腑絎?x+1)灝忕殑緇撶偣”銆?br />錛?錛夋爣璁幫細
鍦ㄧ嚎孌墊爲涓紝濡傛灉瀵逛竴涓粨鐐規(guī)墍琛ㄧず鐨勭嚎孌墊暣浣撹繘琛屼簡鏌愮鎿嶄綔錛岄渶瑕佸湪榪欎釜緇撶偣涓婃墦涓婁竴涓爣璁幫紝鍦ㄤ笅涓嬈″啀鎵懼埌榪欎釜緇撶偣鏃訛紝鍏舵爣璁板氨浼氫笅鏀懼埌鍏朵袱涓瓙緇撶偣涓娿傚湪Splay Tree涓篃鍙互寮曞叆鏍囪銆傛瘮濡傝瀵筟2, 6]榪欎竴孌佃繘琛屾暣浣撴搷浣滐紝灝卞皢緇撶偣1浼稿睍鍒版牴鐨勪綅緗紝灝嗙粨鐐?浼稿睍鍒版牴鐨勫彸瀛愭爲鐨勪綅緗紝鐒跺悗緇撶偣7鐨勫乏瀛愭爲灝辮〃紺篬2, 6]榪欎竴孌碉紝瀵硅繖媯靛瓙鏍戠殑鏍圭粨鐐規(guī)墦涓婃爣璁板茍绔嬪嵆鐢熸晥錛堝繀欏繪槸绔嬪嵆鐢熸晥錛岃屼笉鏄瓑涓嬩竴嬈″紩鐢ㄥ啀鐢熸晥錛夛紝涔熷氨鏄珛鍗蟲敼鍙樿緇撶偣璁板綍鐨勪竴浜涗俊鎭殑鍊箋傚鏋滀笅嬈″啀嬈″紩鐢ㄥ埌榪欎釜緇撶偣錛屽氨瑕佸皢鍏舵爣璁頒笅鏀懼埌鍏朵袱涓瓙緇撶偣澶勶紱
闇瑕佹敞鎰忕殑涓鐐規(guī)槸錛屽鏋滆浼稿睍鏌愪釜緇撶偣x鍒皉鐨勫瓙緇撶偣鐨勪綅緗紝灝卞繀欏諱繚璇佷粠x鍘熸潵鐨勪綅緗埌r鐨勮繖涓瓙緇撶偣錛坸浼稿睍鍚庣殑浣嶇疆錛変笂鐨勬墍鏈夌粨鐐逛笂鍧囨病鏈夋爣璁幫紝鍚﹀垯灝變細瀵艱嚧鏍囪娣蜂貢銆傚洜姝わ紝蹇呴』棣栧厛鎵懼埌榪欎釜緇撶偣x錛屽湪姝よ繃紼嬩腑涓嶆柇涓嬫斁鏍囪銆?br />錛?錛夎嚜搴曞悜涓婄淮鎶ょ殑淇℃伅錛?br />鏍囪鍙互鐪嬫垚涓縐嶈嚜欏跺悜涓嬬淮鎶ょ殑淇℃伅銆傞櫎浜嗘爣璁頒互澶栵紝浣滀負“綰挎鏍?#8221;錛屽線寰榪樿緇存姢涓浜涜嚜搴曞悜涓婄淮鎶ょ殑淇℃伅銆傛瘮濡傚湪sequence榪欓涓紝灝辨湁lmax錛堝乏孌佃繛緇渶澶у拰錛夈乺max錛堝彸孌佃繛緇渶澶у拰錛夈乵idmax錛堝叏孌佃繛緇渶澶у拰錛変互鍙妔um錛堝叏孌墊誨拰錛夌瓑淇℃伅瑕佺淮鎶ゃ傚浜庤繖綾諱笢涓滃叾瀹炰篃寰堝ソ鍔烇紝鍥犱負瀛愭爲澶у皬錛坰z鍩燂級灝辨槸涓縐嶈嚜搴曞悜涓婄淮鎶ょ殑淇℃伅錛屽洜姝ゅ浜庤繖浜涗俊鎭彧瑕佹寜鐓х淮鎶z鍩熺殑鍔炴硶緇存姢鍗沖彲錛堢粺涓鍐欏湪upd鍑芥暟閲岋級銆傚敮涓鐨勪笉鍚岀偣鏄墦鏍囪鏃跺畠浠殑鍊煎彲鑳借鏀瑰彉銆?br />錛?錛夊榪炵畫鎻掑叆鐨勭粨鐐瑰緩鏍戯細
鏈鐨勬彃鍏ヤ笉鏄竴涓竴涓彃鍏ワ紝鑰屾槸涓涓嬪瓙鎻掑叆涓鏁存錛屽洜姝ら渶瑕佸厛灝嗗畠浠緩鎴愪竴媯墊爲銆備竴鑸緩鏍戞搷浣滈兘鏄掑綊鐨勶紝榪欓噷涔熶竴鏍楓傝鐩墠瑕佸A[l..r]寤烘爲錛圓涓哄緟鎻掑叆搴忓垪錛夛紝鑻>r鍒欓鍑猴紝鍚﹀垯鎵懼埌浣嶄簬涓棿鐨勫厓绱爉id = l + r >> 1錛屽皢A[mid]浣滄牴錛屽啀瀵笰[l..mid-1]寤哄乏瀛愭爲錛屽A[mid+1..r]寤哄彸瀛愭爲鍗沖彲銆傝繖鏍峰彲浠ヤ繚璇佷竴寮濮嬪緩鐨勫氨鏄竴媯靛鉤琛℃爲錛屽噺灝忓父鏁板洜瀛愩?br />錛?錛夊洖鏀剁┖闂達細
鏍規(guī)嵁鏈鐨勬暟鎹寖鍥存彁紺猴紝鎻掑叆鐨勭粨鐐規(guī)繪暟鏈澶氬彲鑳借揪鍒?000000錛屼絾鍦ㄤ換浣曟椂鍒繪爲涓渶澶氬彧鏈?00002涓粨鐐癸紙鍖呮嫭涓や釜杈圭晫錛夛紝姝ゆ椂涓轟簡鑺傜渷絀洪棿錛屽彲浠ラ噰鐢ㄥ驚鐜槦鍒楀洖鏀剁┖闂寸殑鏂規(guī)硶銆傚嵆錛氫竴寮濮嬪皢鎵鏈夌殑鍙敤絀洪棿錛堝彲鐢ㄤ笅鏍囷紝鏈涓?~500002錛夊瓨鍦ㄥ驚鐜槦鍒桻閲岋紝鍚屾椂璁劇珛澶村熬鎸囬拡front鍜宺ear錛屾瘡嬈″鏋滄湁鏂扮粨鐐規(guī)彃鍏ワ紝灝卞彇鍑篞[front]騫朵綔涓烘柊緇撶偣鐨勪笅鏍囷紝濡傛灉鏈夌粨鐐硅鍒犻櫎錛堟湰棰樻槸涓嬈″垹闄ゆ暣媯靛瓙鏍戯紝鍥犳鍦ㄥ垹闄ゅ悗闇瑕佸垎鍒洖鏀跺畠浠殑絀洪棿錛夛紝鍒欎粠rear寮濮嬶紝灝嗘瘡涓垹闄ょ殑緇撶偣鐨勪笅鏍囨斁鍥炲埌Q閲屻傚綋鐒訛紝榪欑鏂規(guī)硶鏄鐗虹壊涓瀹氱殑鏃墮棿鐨勶紝鍥犳鍦ㄧ┖闂翠笉鏄壒鍒悆绱х殑鎯呭喌涓嬩笉瑕佺敤銆?br />
銆?012騫?鏈?6鏃ユ洿鏂般?br />浠婂ぉ閲嶅啓sequence鐨勬椂鍊欙紝縐冪劧鍙戠幇鍔犲叆鐨勮竟鐣岀偣鍙兘浼氬lmax銆乺max銆乵idmax絳夌殑緇存姢閫犳垚褰卞搷錛氬綋搴忓垪涓墍鏈夌殑鍊奸兘鏄礋鏁版椂錛岃嫢杈圭晫鐐圭殑鍊艱涓?錛屽皢浣胯繖3涓間篃涓?錛屾墍浠ワ紝杈圭晫鐐圭殑鍊煎簲璁句負-INF錛堜笉浼氬獎鍝嶅埌sum錛屽洜涓哄彲浠ュ崟鐙皟鍑篬l, r]鐨剆um錛岄伩寮杈圭晫錛夈傝繖灝辮鏄庡茍闈炴墍鏈夎繖鏍風殑棰樹腑閮藉彲浠ヨ緗竟鐣岀偣錛堟瘮濡侶FTSC2011鐨勯偅棰樺氨涓嶈錛夛紝濡傛灉杈圭晫鐐逛細瀵圭淮鎶ょ殑淇℃伅閫犳垚褰卞搷錛屽氨涓嶈兘璁劇疆杈圭晫鐐癸紝鍦ㄥ悇涓搷浣滀腑錛屽垎4縐嶆儏鍐靛垽鏂傦紙浠g爜宸茬粡淇敼錛?br />
涓嬮潰涓婁唬鐮佷簡錛?
#include <stdio.h>
using namespace std;
#define re(i, n) for (int i=0; i<n; i++)
#define re1(i, n) for (int i=1; i<=n; i++)
const int MAXN = 500002, NOSM = -2000, INF = ~0U >> 2;
struct node {
int v, c[2], p, sz, sum, lmax, rmax, midmax, sm;
bool rev, d;
} T[MAXN + 1];
int root, Q[MAXN + 1], front, rear, a[MAXN], len, res;
int max(int SS0, int SS1)
{
return SS0 >= SS1 ? SS0 : SS1;
}
int max(int SS0, int SS1, int SS2)
{
int M0 = SS0 >= SS1 ? SS0 : SS1; return M0 >= SS2 ? M0 : SS2;
}
void newnode(int n, int _v)
{
T[n].v = T[n].sum = T[n].lmax = T[n].rmax = T[n].midmax = _v; T[n].c[0] = T[n].c[1] = 0; T[n].sz = 1; T[n].sm = NOSM; T[n].rev = 0;
}
void sc(int _p, int _c, bool _d)
{
T[_p].c[_d] = _c; T[_c].p = _p; T[_c].d = _d;
}
void sm_opr(int x, int SM)
{
T[x].sum = T[x].sz * SM;
if (SM > 0) T[x].lmax = T[x].rmax = T[x].midmax = T[x].sum; else T[x].lmax = T[x].rmax = T[x].midmax = SM;
}
void rev_opr(int x)
{
int c0 = T[x].c[0], c1 = T[x].c[1]; sc(x, c0, 1); sc(x, c1, 0);
int tmp = T[x].lmax; T[x].lmax = T[x].rmax; T[x].rmax = tmp;
}
void dm(int x)
{
int SM0 = T[x].sm;
if (SM0 != NOSM) {
T[x].v = T[T[x].c[0]].sm = T[T[x].c[1]].sm = SM0; T[x].sm = NOSM;
sm_opr(T[x].c[0], SM0); sm_opr(T[x].c[1], SM0);
}
if (T[x].rev) {
T[T[x].c[0]].rev = !T[T[x].c[0]].rev; T[T[x].c[1]].rev = !T[T[x].c[1]].rev; T[x].rev = 0;
rev_opr(T[x].c[0]); rev_opr(T[x].c[1]);
}
}
void upd(int x)
{
int c0 = T[x].c[0], c1 = T[x].c[1];
T[x].sz = T[c0].sz + T[c1].sz + 1;
T[x].sum = T[c0].sum + T[c1].sum + T[x].v;
T[x].lmax = max(T[c0].lmax, T[c0].sum + T[x].v + max(T[c1].lmax, 0));
T[x].rmax = max(T[c1].rmax, max(T[c0].rmax, 0) + T[x].v + T[c1].sum);
T[x].midmax = max(T[c0].midmax, T[c1].midmax, max(T[c0].rmax, 0) + T[x].v + max(T[c1].lmax, 0));
}
void rot(int x)
{
int y = T[x].p; bool d = T[x].d;
if (y == root) {root = x; T[root].p = 0;} else sc(T[y].p, x, T[y].d);
sc(y, T[x].c[!d], d); sc(x, y, !d); upd(y);
}
void splay(int x, int r)
{
int p; while ((p = T[x].p) != r) if (T[p].p == r) rot(x); else if (T[x].d == T[p].d) {rot(p); rot(x);} else {rot(x); rot(x);} upd(x);
}
int Find_Kth(int K)
{
int i = root, S0;
while (i) {
dm(i); S0 = T[T[i].c[0]].sz + 1;
if (K == S0) break; else if (K < S0) i = T[i].c[0]; else {K -= S0; i = T[i].c[1];}
}
return i;
}
int mkt(int l, int r)
{
if (l > r) return 0;
int n0 = Q[front], mid = l + r >> 1; if (front == MAXN) front = 1; else front++;
newnode(n0, a[mid]); int l_r = mkt(l, mid - 1), r_r = mkt(mid + 1, r);
sc(n0, l_r, 0); sc(n0, r_r, 1); upd(n0); return n0;
}
void ins(int pos)
{
int P0 = Find_Kth(pos); splay(P0, 0); int P1 = Find_Kth(pos + 1); splay(P1, root); sc(P1, mkt(0, len - 1), 0); upd(P1); upd(P0);
}
void era(int x)
{
if (!x) return;
if (rear == MAXN) rear = 1; else rear++; Q[rear] = x;
era(T[x].c[0]); era(T[x].c[1]);
}
void del(int l, int r)
{
int P0 = Find_Kth(l - 1); splay(P0, 0); int P1 = Find_Kth(r + 1); splay(P1, root);
int root0 = T[P1].c[0]; sc(P1, 0, 0); upd(P1); upd(P0); era(root0);
}
void mksame(int l, int r, int x)
{
int P0 = Find_Kth(l - 1); splay(P0, 0); int P1 = Find_Kth(r + 1); splay(P1, root);
int n = T[P1].c[0]; T[n].sm = x; sm_opr(n, x); upd(P1); upd(P0);
}
void reve(int l, int r)
{
int P0 = Find_Kth(l - 1); splay(P0, 0); int P1 = Find_Kth(r + 1); splay(P1, root);
int n = T[P1].c[0]; T[n].rev = !T[n].rev; rev_opr(n); upd(P1); upd(P0);
}
int get_sum(int l, int r)
{
int P0 = Find_Kth(l - 1); splay(P0, 0); int P1 = Find_Kth(r + 1); splay(P1, root);
int n = T[P1].c[0]; return T[n].sum;
}
int max_sum()
{
return T[root].midmax;
}
void prepare()
{
T[0].sz = T[0].sum = T[0].lmax = T[0].rmax = T[0].midmax = 0;
front = 3; rear = MAXN; re1(i, MAXN) Q[i] = i;
newnode(1, -INF); newnode(2, -INF); sc(1, 2, 1); root = 1; T[root].p = 0;
}
int main()
{
freopen("sequence.in", "r", stdin);
freopen("sequence.out", "w", stdout);
prepare();
int m, l, r, x;
scanf("%d%d", &len, &m); char ch = getchar(), str[1000];
re(i, len) scanf("%d", &a[i]); ins(1);
re(i, m) {
scanf("%s", str);
if (!strcmp(str, "INSERT")) {scanf("%d%d", &l, &len); re(i, len) scanf("%d", &a[i]); ins(++l);}
if (!strcmp(str, "DELETE")) {scanf("%d%d", &l, &r); r += l++; del(l, r);}
if (!strcmp(str, "MAKE-SAME")) {scanf("%d%d%d", &l, &r, &x); r += l++; mksame(l, r, x);}
if (!strcmp(str, "REVERSE")) {scanf("%d%d", &l, &r); r += l++; reve(l, r);}
if (!strcmp(str, "GET-SUM")) {scanf("%d%d", &l, &r); r += l++; printf("%d\n", get_sum(l, r));}
if (!strcmp(str, "MAX-SUM")) printf("%d\n", max_sum());
ch = getchar();
}
fclose(stdin); fclose(stdout);
return 0;
}
鏈鍚庢妸鎴戠殑榪欎釜浠g爜涓嶣YVoid紲炵妵鐨勬湰棰樹唬鐮佽繘琛屾祴璇曟瘮杈冿紝緇撴灉錛圔YVoid紲炵妵鐨勪唬鐮佽榪欓噷錛夛細
BYVoid紲炵妵鐨勶細
鏈矙鑼剁殑錛?br />
銆愮浉鍏寵鏂囥?br />
]]>
銆愰噸澶嶆鏁癿ul銆?br />鍦ㄥ墠闈㈢涓綃囨葷粨Splay Tree鐨勬椂鍊欏氨鎻愬埌浜嗙粨鐐圭殑閲嶅嬈℃暟(mul)鍩燂紝榪欎釜涓滀笢鑷充粖鍦ㄧ綉涓婅繕綾崇湅瑙佹湁鐘囩敤錛堝湪鏈矙鑼惰榪囩殑鑼冨洿鍐咃級錛屼絾鏄笉鍙惁璁ょ殑鏄繖涓煙鍦ㄦ煇浜涙儏鍐典笅鍑犱箮鏄?#8220;蹇呴』浣跨敤”鐨勩?br />鎵璋撻噸澶嶆鏁幫紝灝辨槸灝嗘爲涓墍鏈夊?v)鐩稿悓鐨勭粨鐐瑰叏閮ㄥ悎騫舵垚涓涓紝榪欎簺緇撶偣鐨勬諱釜鏁板氨鏄悎騫跺悗鐨勭粨鐐圭殑mul鍊箋傛瘮濡傦紝鍦ㄤ竴媯電┖鏍戜腑鎻掑叆3涓間負5鐨勭粨鐐瑰悗錛屽湪浣跨敤mul鍩熺殑鎯呭喌涓嬶紝鏍戜腑鍙湁涓涓粨鐐癸紝鍏秜鍊間負5錛宮ul鍊間負3銆?br />鍦ㄥ鉤琛℃爲涓紝鍊肩浉鍚岀殑緇撶偣紜疄闈炲父紕嶄簨銆傛寜鐓т簩鍙夋煡鎵炬爲鐨勫畾涔夛細“瑕佷箞鏄竴媯電┖鏍戯紝瑕佷箞鏄竴媯墊弧瓚充互涓嬫潯浠剁殑闈炵┖鏍戯細鏍圭粨鐐瑰乏瀛愭爲涓墍鏈夌粨鐐圭殑鍊煎潎灝忎簬鏍圭粨鐐癸紝鏍圭粨鐐瑰彸瀛愭爲涓墍鏈夌粨鐐圭殑鍊煎潎澶т簬鏍圭粨鐐癸紝涓旀牴鐨勫乏鍙沖瓙鏍戝潎涓轟簩鍙夋煡鎵炬爲”錛屽湪浜屽弶鏌ユ壘鏍戜腑錛屾槸涓嶅簲璇ュ嚭鐜板肩浉鍚岀殑緇撶偣鐨勩傚彲鏄湪瀹為檯闂涓紝鍑虹幇鍊肩浉鍚岀殑緇撶偣鍑犱箮鏄笉鍙伩鍏嶇殑銆傛鏃訛紝鏍戠殑瀹氫箟灝變細鍙樺緱闈炲父妯$硦錛屼篃灝辨槸瑕佹妸浜屽弶鏌ユ壘鏍戝畾涔変腑鐨?#8220;灝忎簬”鍏ㄩ儴鏀逛負“灝忎簬絳変簬”錛?#8220;澶т簬”鍏ㄩ儴鏀逛負“澶т簬絳変簬”銆傝繖鏍峰畾涔夌殑鏍戝湪涓鑸儏鍐典笅涔熺背鏈夌椹棶棰橈紝浣嗘槸鍦ㄦ壘鍓嶈秼(Pred)鍜屾壘鍚庣戶(Succ)鎿嶄綔涓紝闂灝辨潵浜嗐傚洜涓烘牴緇撶偣鐨勫墠瓚嬪拰鍚庣戶鐨勫煎彲鑳戒笌鏍圭粨鐐圭浉絳夛紙姣斿 HNOI2004 瀹犵墿鏀跺吇鎵 閭d竴棰橈級錛岃繖鏃訛紝鏍圭粨鐐圭殑鍓嶈秼鏃㈡湁鍙兘鍦ㄥ乏瀛愭爲閲岋紝涔熸湁鍙兘鍦ㄥ彸瀛愭爲閲岋紝鏍圭粨鐐圭殑鍚庣戶涔熶竴鏍楓傛鏃訛紝榪欎袱涓搷浣滃氨鏃犳硶榪涜浜嗐?
銆恗ul鍩熺殑緇存姢銆?br />mul鍩熷叾瀹炲彲浠ョ湅鎴愮粨鐐圭殑涓涓湰韜睘鎬э紝鍜寁涓鏍楓傚洜姝ゅ湪鏃嬭漿銆佷幾灞曟搷浣滀腑浠諱綍緇撶偣鐨刴ul鍊奸兘鏄笉浼氭敼鍙樼殑銆傚彲鑳芥敼鍙樼粨鐐筸ul鍊肩殑鍦版柟鍙湁涓ゅ錛氫竴鏄彃鍏ワ紝浜屾槸鍒犻櫎銆傚湪鎻掑叆涓涓間負_v鐨勭粨鐐圭殑鏃跺欙紝濡傛灉鍙戠幇鍊間負_v鐨勭粨鐐瑰湪鏍戜腑宸茬粡瀛樺湪錛屽垯鍙細灝嗚繖涓粨鐐圭殑mul鍊煎姞1錛岃屼笉鏄湡姝f彃鍏ヤ竴涓柊鐨勭粨鐐廣傚悓鏍風殑錛屽湪鍒犻櫎涓涓粨鐐圭殑鏃跺欙紝濡傛灉榪欎釜緇撶偣鐨刴ul鍊煎ぇ浜?錛屽垯鍙細灝嗚繖涓粨鐐圭殑mul鍊煎噺1錛岃屼笉鏄湡姝e垹闄ゃ?br />銆恗ul鍩熺殑浣滅敤銆?br />mul鍩熸渶涓昏鐨勪綔鐢ㄥ氨鏄В鍐沖肩浉鍚岀殑緇撶偣瀵逛簬鏌愪簺鎿嶄綔鐨勫獎鍝嶃傚彟澶栵紝mul鍩熺殑寮曞叆鍙互鍑忓皯鏍戜腑緇撶偣鐨勬諱釜鏁幫紙灝ゅ叾鏄綋鎻掑叆鐨勭粨鐐規(guī)暟寰堝鑰岀粨鐐圭殑鍊肩殑鑼冨洿涓嶅ぇ鐨勬椂鍊欙級錛屼粠鑰岄檷浣庢椂闂村鏉傚害錛堝噯紜潵璇村彲浠ラ檷浣庡父鏁幫級銆?br />銆怱play Tree鐨勮繘闃舵搷浣溿?br /><1>鎵鵑潪鏍圭粨鐐圭殑鍓嶈秼鍜屽悗緇с?br />Splay Tree鐢變簬鏈変幾灞曟搷浣滐紝鍙互灝嗚姹傚墠瓚嬫垨鍚庣戶鐨勭偣浼稿睍鍒版牴鍐嶆眰鍓嶈秼鎴栧悗緇с傚鏋滆涓嶉氳繃浼稿睍鎿嶄綔鎵句竴涓潪鏍圭粨鐐圭殑鍓嶈秼鎴栧悗緇ф庝箞鍔烇紵
璁捐繖涓粨鐐逛負x銆傚鏋渪鏈夊乏瀛愮粨鐐癸紝鍒檟鐨勫墠瓚嬪氨鏄痻鐨勫乏瀛愮粨鐐圭殑鍙抽摼涓婄殑鏈鍚庝竴涓粨鐐癸紱濡傛灉x娌℃湁宸﹀瓙緇撶偣錛屽垯x鐨勫墠瓚嬪氨鏄粠x寮濮嬪線涓婏紙寰x鐨勭鍏堬級鏌ユ壘錛岀洿鍒版壘鍒扮涓涓槸鍏剁埗緇撶偣鐨勫彸瀛愮粨鐐圭殑緇撶偣涓烘錛屽垯榪欎釜緇撶偣鐨勭埗緇撶偣灝辨槸x鐨勫墠瓚嬶紙鎴栬呰錛屽氨鏄笉鏂部鐫x鐨勭埗緇撶偣寰涓婃壘錛屼竴寮濮嬮兘鏄線鍙崇殑錛屾壘鍒扮涓涓線宸︾殑灝辮浜嗭級銆傚悗緇у垯姝eソ鐩稿弽銆傝瘉鏄庡彲浠ョ敤涓簭閬嶅巻銆?br /><2>鎵炬煇涓紇0鐨勫墠瓚嬪拰鍚庣戶錛堝間負v0鐨勭粨鐐瑰湪鏍戜腑涓嶄竴瀹氬瓨鍦級銆?br />鎵璋搗0鐨勫墠瓚嬪拰鍚庣戶錛屽氨鏄寚鍦ㄦ爲涓煎皬浜庯紙涔熸湁鐨勬槸涓嶅ぇ浜庯級v0鐨勬渶澶х殑緇撶偣鐨勫鹼紝鍜屾爲涓煎ぇ浜庯紙涔熸湁鐨勬槸涓嶅皬浜庯級v0鐨勬渶灝忕殑緇撶偣鐨勫箋傚湪鏈変簡鎿嶄綔錛?錛夈愪笉閫氳繃浼稿睍鎿嶄綔鎵鵑潪鏍圭粨鐐圭殑鍓嶈秼鍜屽悗緇с戜互鍚庯紝榪欎釜鎿嶄綔鍙樺緱鏋佷負瀹規(guī)槗錛氬厛榪涜鏅氱殑鏌ユ壘鎿嶄綔錛堟煡鎵懼間負v0鐨勭粨鐐癸級錛屽鏋滆兘鎵懼埌錛屽垯鍓╀笅鐨勬楠ゅ氨鍜屾搷浣滐紙1錛変竴鏍蜂簡錛涘鏋滄壘涓嶅埌錛屽垯蹇呯劧鏄壘鍒版煇涓┖緇撶偣錛?錛夊錛屽亣璁懼湪榪欓噷鎻掑叆涓涓間負v0鐨勭粨鐐癸紙鍙槸鍋囪錛屼笉鏄湡鎻掑叆錛夛紝鍒欒緇撶偣鏄劇劧鏄病鏈夊乏瀛愮粨鐐圭殑錛屽洜姝ゅ氨鏄?#8220;浠庤緇撶偣寮濮嬪線涓婃煡鎵撅紝鐩村埌鎵懼埌絎竴涓槸鍏剁埗緇撶偣鐨勫彸瀛愮粨鐐圭殑緇撶偣涓烘錛屽垯榪欎釜緇撶偣鐨勭埗緇撶偣灝辨槸璇ョ粨鐐圭殑鍓嶈秼”錛屼篃灝辨槸v0鐨勫墠瓚嬶紱鍚庣戶綾諱技銆?br />鍦ㄦ煡鎵捐繃紼嬩腑鍙互榪涜涓涓父鏁頒紭鍖栵細璁劇偣i涓烘煡鎵捐繃紼嬩腑“鍙寵漿”鐨勬渶鍚庝竴涓粨鐐癸紙鍗蟲壘鍒拌緇撶偣鍚庯紝鎺ヤ笅鏉ユ槸璇ョ粨鐐圭殑鍙沖瓙緇撶偣錛夛紝姣忔寰鍙沖瓙緇撶偣杞殑鏃跺欏氨鏇存柊i錛屽垯鏈鍚庣粨鐐筰灝辨槸鍊紇0鐨勫墠瓚嬶紱鍚庣戶綾諱技銆?br /><3>鍒犻櫎鎵鏈夊煎湪鏌愬尯闂村唴鐨勭粨鐐癸紙榪欎釜鍖洪棿鍙互鏄紑鍖洪棿銆侀棴鍖洪棿鎴栧崐寮鍗婇棴鍖洪棿錛夈?br />浠ュ紑鍖洪棿涓轟緥錛氬垹闄ゆ爲涓墍鏈夊煎湪(l, r)鑼冨洿鍐呯殑緇撶偣銆傚厛鎵懼埌l(fā)鐨勫墠瓚婸鍜宺鐨勫悗緇錛堟敞鎰忚繖閲岀殑鍓嶈秼鍜屽悗緇ф槸鍖呮嫭“絳変簬”鐨勶級錛岀劧鍚庡皢P浼稿睍鍒版牴錛孲浼稿睍鍒癙鐨勫彸瀛愮粨鐐瑰錛屽垯S鐨勫乏瀛愭爲涓氨鏄墍鏈夊煎湪(l, r)鑼冨洿鍐呯殑緇撶偣錛岀洿鎺ュ垹鎺夎繖媯靛瓙鏍戝嵆鍙紙娉ㄦ剰鍒犻櫎鍚庤鏇存柊S鍜孭錛夛紱鑻ユ敼涓洪棴鍖洪棿錛屽垯灝嗗墠瓚嬪拰鍚庣戶涓殑“絳変簬”鍘繪帀錛堝嵆蹇呴』鏄皬浜庢垨澶т簬錛夛紱鍗婂紑鍗婇棴鍖洪棿鍒欎竴鍗婃寜寮鍖洪棿澶勭悊錛屼竴鍗婃寜闂尯闂村鐞嗐傞棶棰樻槸錛屽鏋滅偣P鎴栫偣S涓嶅瓨鍦ㄦ庝箞鍔炪傛湁涓ょ瑙e喅鍔炴硶錛屼竴鏄嫢P鍜孲涔嬩竴瀛樺湪錛屽垯灝嗗叾浼稿睍鍒版牴錛岀劧鍚庣洿鎺ュ垹鎺夊叾宸﹀瓙鏍戞垨鍙沖瓙鏍戝嵆鍙紱鑻鍜孲閮戒笉瀛樺湪錛屽垯鏍戜負絀猴紝鐩存帴灝唕oot緗負0鍗沖彲錛涗簩鏄寜鐓equence鐨勫姙娉曪紝鍔犲叆涓や釜杈圭晫緇撶偣錛屽綋鍓嶈秼鎴栧悗緇т笉瀛樺湪鏃跺氨璁や負鏄竟鐣岀粨鐐廣?br />鍏跺疄涓嶅厜鏄垹闄わ紝鍦ㄦ壘鍒頒簡榪欐5瀛愭爲鍚庡彲浠ュ瀹冭繘琛屼竴浜涙暣浣撴搷浣滐紝浠庤岃Splay Tree鍏鋒湁綰挎鏍戠殑鍔熻兘錛堣繖涓湪涓嬮潰鐨凬OI2005 sequence閭d竴棰橀噷闈細鎬葷粨錛夈?br /><4>鎻掑叆涓媯墊爲錛堝綋鐒惰繖媯墊爲涔熸槸Splay Tree錛屽茍涓斿師鏍戜腑鐨勭粨鐐瑰煎簭鍒椾笌鏂版爲涓殑緇撶偣鍊煎簭鍒椾笉鐩鎬氦錛夈?br />鏈夋椂鍊欙紝棰樼洰涓細榪炵畫鍑虹幇寰堝鎻掑叆鎿嶄綔錛屼腑闂存病鏈夊叾瀹冩搷浣滐紝姝ゆ椂錛屼笌鍏朵竴涓竴涓彃鍏ワ紝榪樹笉濡傚皢瀹冧滑鍏堝緩鎴愪竴媯墊爲錛堝緩鏍戠殑鏂規(guī)硶鍦ㄤ笅涓綃囬噷鎬葷粨錛夛紝鍐嶆暣浣撴彃鍏ャ傛暣浣撴彃鍏ョ殑鏂規(guī)硶錛氳L鍜孯鍒嗗埆鏄柊鏍戦噷鍊兼渶灝忕殑緇撶偣鍜屽兼渶澶х殑緇撶偣錛屽湪鍘熸爲涓壘鍒癓鐨勫墠瓚婸鍜孯鐨勫悗緇錛屽皢P浼稿睍鍒版牴錛孲浼稿睍鍒癙鐨勫彸瀛愮粨鐐瑰錛岀敱浜庡師鏍戜腑鐨勭粨鐐瑰煎簭鍒椾笌鏂版爲涓殑緇撶偣鍊煎簭鍒椾笉鐩鎬氦錛堜篃灝辨槸鍘熸爲涓殑緇撶偣鍊艱涔堝皬浜嶭鐨勫鹼紝瑕佷箞澶т簬R鐨勫鹼級錛屽洜姝鏃犲乏瀛愮粨鐐癸紝姝ゆ椂灝嗘柊鏍戜綔涓篠鐨勫乏瀛愭爲鍗沖彲銆?br />
]]>
]]>