锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
銆怐ay1銆?br />
meow錛?br />
k=2錛氬厛灝嗚繖N涓猟緇村悜閲忕粍鎴愪竴涓狽*d鐨勭煩闃礎錛屽垯A*AT&e1;i&e3;&e1;j&e3;(mod 2)灝辨槸鍚戦噺i•鍚戦噺j(mod 2)錛屽洜姝ら棶棰樻湁瑙e綋涓斾粎褰揂*AT涓嶆槸鍏?銆?br />
闅忔満1*N鐨勫悜閲弙錛岀湅(v*A)*AT鏄惁絳変簬v*(N*N鐨勫叏1鐭╅樀)錛屽鏋淎*AT涓嶆槸鍏?閭d箞鏈熸湜璇曚袱嬈″氨鍙互寰楀埌涓嶇瓑鐨勭粨鏋溿傦紙濡傛灉璇曚簡10嬈¢兘鏄浉絳夛紝灝辮涓烘棤瑙o級
濡傛灉涓よ竟鐨勪箻縐笉絳夛紝鍒欐壘鍒伴偅涓笉絳夌殑鍒楋紝璁句負絎琲鍒楋紝鍒欏繀鐒跺瓨鍦ㄤ竴涓В鍖呭惈鍚戦噺i錛屾灇涓懼彟涓涓嵆鍙傛椂闂村鏉傚害O(Nd)
k=3錛氳綆?A*AT)&e1;i&e3;&e1;j&e3;2(mod 3)錛屽嵆(Σ(xik*xjk))2錛屽嵆Σ(xik1*xik2*xjk1*xjk2)(mod 3)錛屽姣忎釜鍚戦噺鏋勯犱竴涓猟2緇村悜閲忥紝涓轟箣鍓嶇殑姣忎釜鍚戦噺鍚勭淮涓や袱鐩鎬箻鐨勭粨鏋滐紝鍒欒漿鍖栦負k=2鐨勬儏鍐碉紙鍙笉榪囧皢mod 2鏀逛負mod 3錛夛紝鏃墮棿澶嶆潅搴(Nd2)錛屽父鏁板皬涓鐐癸紙姣斿灝戠畻mod錛夊彲浠ュ崱榪囧幓銆?br />
count錛?br />
錛堟瑙i渶瑕佹煇浜涘緢濂囨殑鎬ц川錛屾湰娌欒尪鐪嬩笉鍑烘潵錛屽彧浼?5鍒嗙殑錛?br />
閫掓帹錛岃F&e1;i&e3;&e1;j&e3;鍜孏&e1;i&e3;&e1;j&e3;琛ㄧず鏌愬眰鏄疊FS搴忓垪鐨?amp;e1;i..j&e3;榪欎竴孌碉紝鏍戠殑鎬婚珮搴﹀拰鏍戠殑媯墊暟錛堟墍姹傚鉤鍧囧煎嵆涓篎&e1;i&e3;&e1;j&e3; / G&e1;i&e3;&e1;j&e3;錛夈?br />
鍒欐灇涓緆錛岃嫢k婊¤凍涓瀹氭潯浠?/span>錛屽垯F&e1;j+1&e3;&e1;k&e3;+=F&e1;i&e3;&e1;j&e3;+G&e1;i&e3;&e1;j&e3;錛孏&e1;j+1&e3;&e1;k&e3;+=G&e1;i&e3;&e1;j&e3;銆?br />
闂鏄繖涓?#8220;涓瀹氭潯浠?#8221;鏄粈涔堬紙鏈闅炬悶鐨勫湴鏂瑰洤錛?br />
絎浂錛孊FS&e1;j+1..k&e3;榪欎竴孌電殑鍚勪釜緇撶偣鍦―FS搴忓垪涓殑浣嶇疆閫掑錛堣繖涓緢鏄劇劧錛夈?br />
絎竴錛孊FS&e1;j+1..k&e3;榪欎竴孌電殑鍚勪釜緇撶偣鍦―FS搴忓垪涓殑浣嶇疆涔嬪墠閮藉繀欏繪湁鍦˙FS&e1;i..j&e3;鑼冨洿鍐呯殑緇撶偣錛屼綔涓哄畠鐨勭埗緇撶偣錛堣繖涓篃寰堟樉鐒訛級錛?br />
絎簩錛孌FS搴忓垪涓紝鎵鏈夊湪BFS&e1;i..j&e3;鑼冨洿鍐呯殑緇撶偣鐨勪笅涓涓綅緗鏋滀笉鏄湪BFS&e1;0..i-1&e3;鑼冨洿鍐呯殑錛屽氨蹇呴』鏄疊FS&e1;j+1..k&e3;鑼冨洿鍐呯殑錛屽洜涓鴻繖琛ㄧず瀹冪殑絎竴涓瓙緇撶偣錛堣繖涓伆甯擱毦鎯沖埌錛侊紒錛侊紒錛侊紒錛侊紒錛侊紒錛侊紒錛侊紒錛佹湰娌欒尪灝辨寕鍦ㄨ繖閲屼簡鍥?#8230;…錛?br />
瀵逛簬絎浂鍜岀涓錛屽疄闄呬笂鏄粰鍑轟簡k鐨勪笂闄愶紝鏋氫婦k鏃朵笉絎﹀悎榪欎釜鏉′歡鍒欓鍑猴紝鑰岀浜屽垯鏄粰鍑轟簡k鐨勪笅闄愶紙鎵鏈夌殑“涓嬩竴涓綅緗?#8221;瑕佸~婊℃墠鑳界畻錛夛紱
姝ゅ錛孎鍜孏瑕佺敤long double錛坉ouble涔熶細鐖嗭紝涓嶇敤鎷呭績綺懼害錛屾湰娌欒尪褰撴椂榪樺湪濡備綍緇存姢騫沖潎鍊肩殑闂涓婄籂緇撲簡寰堜箙……錛?br />
榪欎釜鍋氭硶鏄疧(N3)鐨勶紝浣嗗姞涓婇偅浜涗紭鍖栧氨鍙互85鍒嗕簡鍥?#8230;…
錛堟湰娌欒尪褰撴椂鎯沖埌榪欎釜鍋氭硶浜嗭紝涔熸兂鍒頒簡絎浂鍜岀涓錛屼絾鏈ㄦ湁鎯沖埌絎簩錛岀粨鏋滄寕浜?#8230;…瑕佹槸鐪熷緱鍒?5鍒嗭紝鎬誨垎254錛岀ǔ鐨剅ank1浜?#8230;…鐪熸偛鍓э紝鐪熸偛鍓э紝鐪熸偛鍓э紝鐪熸偛鍓э紝鐪熸偛鍓э紝鐪熸偛鍓э紝鐪熸偛鍓э紝鐪熸偛鍓э紝鐪熸偛鍓э紝鐪熸偛鍓э紝鐪熸偛鍓э紝鐪熸偛鍓э紝鐪熸偛鍓э紝鐪熸偛鍓э紝鐪熸偛鍓э紝鐪熸偛鍓?#8230;…錛?br />
train錛?br />
鍙蹭笂鏈姘寸殑鎻愪氦絳旀……鏁翠釜灝辨槸涓狽OIP鏅強緇勯毦搴︾殑棰?#8230;…
棣栧厛鍒嗘瀽鏁版嵁灝變笉闅懼彂鐜拌繖10涓偣鍏跺疄鏄竴縐嶆ā鍨嬶細
涓寮濮嬫湁鑻ュ共鍏冮挶錛堢敤鍙橀噺v 2琛ㄧず錛夈?br />
鏈夎嫢騫蹭釜澶у潡錛屾瘡涓ぇ鍧楀彲浠ラ夋嫨榪涙垨鑰呬笉榪涳紝濡傛灉榪涳紝灝辮浠樺嚭涓浜涢挶錛屽鏋滀笉榪涳紝灝辮嚜鍔ㄨ煩杞埌鍚庨潰鐨勬煇涓ぇ鍧椼?br />
鍦ㄦ瘡涓ぇ鍧楅噷鏈夎嫢騫蹭釜錛堜笉瓚呰繃25涓級灝忓潡錛屾湁1鎴?0涓彉閲忥紝姣忎釜灝忓潡涔熷彲浠ラ夋嫨瑕佹垨鑰呬笉瑕侊紝濡傛灉瑕侊紝灝卞鎵鏈夌殑鍙橀噺鍚勫姞涓婁竴涓晥鏋滃鹼紙鍙鍙礋錛夈?br />
鐩爣鏄墍鏈夊彉閲忕殑緇濆鍊間箣鍜屾渶澶э紙姣忎釜澶у潡鏈熬浼氱粨綆椾竴嬈★紝鐒跺悗灝嗘墍鏈夊彉閲忕殑鍊兼竻闆訛級
棣栧厛姣忎釜澶у潡鍐呴夊摢浜涘皬鍧楀彲浠ユ毚鍔涙灇涓撅紝鐒跺悗寰楀埌鏈澶х殑鎬葷粷瀵瑰鹼紝璁句負val&e1;i&e3;錛坕涓哄ぇ鍧楃紪鍙鳳級錛岃濡傛灉涓嶈繘絎琲涓ぇ鍧楋紝璺沖埌鐨勫ぇ鍧楃紪鍙蜂負B&e1;i&e3;錛岀i涓ぇ鍧椾粯鍑虹殑閽變負V&e1;i&e3;銆?br />
鑰屽ぇ鍧椾箣闂村氨鏄竴涓被浼間簬01鑳屽寘鐨勬ā鍨嬶紝璁綟&e1;i&e3;&e1;j&e3;琛ㄧず鍒拌揪絎琲涓ぇ鍧楋紙灝氭湭浣滃嚭閫夋嫨錛夋椂錛岀敤鎺変簡j鍏冮挶鐨勬渶澶ф繪晥鏋滃鹼紝鐢‵&e1;i&e3;&e1;j&e3;鏇存柊F&e1;B&e1;i&e3;&e3;&e1;j&e3;錛岃嫢涓嶈秴榪囦竴寮濮嬬殑鎬婚挶鏁板垯鐢‵&e1;i&e3;&e1;j&e3;+val&e1;i&e3;鏇存柊F&e1;i+1&e3;&e1;j+V&e1;i&e3;&e3;錛岃瀹炴椂淇濆瓨鏈浼樺喅絳栥?br />
杈撳嚭鐨勬椂鍊欐敞鎰忎竴涓嬶紝閭i噷闈㈡湁鍑犱釜鐐癸紝褰撻挶涓嶅鏃朵細鑷姩閫夋嫨涓嶈繘褰撳墠澶у潡錛屾湪鏈夊繀瑕佷綔鍑洪夋嫨浜嗐?br />
鑷蟲Day1瀹屾寕銆?br />
銆怐ay2銆?br />
matrix錛?br />
鐭╅樀涔樻硶錛屽崄榪涘埗蹇熷箓銆傛病浜嗐?br />
penman錛?br />
姣旇緝鐚ョ悙鐨凞P棰?#8230;…
閲嶇偣鏄繖涓細鎵鏈夌殑鍥懼艦閮藉彲浠ユ媶鎴愬崟鍒楋紝涓鍒椾竴鍒楀湴寮勶紙鏈矙鑼跺お寮變簡錛岃繖涓兘鏈ㄦ湁鎯寵搗鏉ワ級錛岀劧鍚庡氨鏄笁緇碊P銆?br />
N錛氳F&e1;i&e3;&e1;j&e3;&e1;k&e3;&e1;st&e3;琛ㄧず絎琲鍒楋紝涓婁笅杈圭晫鍒嗗埆涓簀銆乲琛岋紝鐘舵佷負絎瑂t涓儴鍒嗭紙絎?閮ㄥ垎涓烘渶宸﹁竟涓绔栵紝絎?閮ㄥ垎涓轟腑闂磋嫢騫插潡錛岀2閮ㄥ垎涓烘渶鍙寵竟涓绔栵級鐨勬渶浼樿В錛岃綆楀ソ涓鍒椾箣鍚庢眰鍑轟竴澶у爢杈呭姪鍊鹼紝灝卞彲浠ヤ嬌涓嬩竴鍒桹(1)綆楀嚭浜嗐?br />
I錛氳F&e1;i&e3;&e1;j&e3;&e1;k&e3;&e1;st&e3;琛ㄧず絎琲鍒楋紝涓婁笅杈圭晫鍒嗗埆涓簀銆乲琛岋紝鐘舵佷負絎瑂t涓儴鍒嗭紙絎?閮ㄥ垎涓洪偅涓绔栫殑宸﹁竟錛岀1閮ㄥ垎涓洪偅涓绔栵紝絎?閮ㄥ垎涓洪偅涓绔栫殑鍙寵竟錛夌殑鏈浼樿В錛屼笉闇瑕佽緟鍔╁鹼紝鐩存帴姹傚嵆鍙紱
O錛氬彲浠P錛屼絾鏇村ソ鐨勫姙娉曟槸鏋氫婦宸︺佸彸銆佷笂杈圭晫錛岀劧鍚庢壂鎻忥紝璇村畠鏇村ソ鏄洜涓虹煡閬撲簡宸﹀彸杈圭晫錛屽彲浠ョ洿鎺ュ紩鍑哄乏杈圭殑N鍜屽彸杈圭殑I鐨勬渶浼樿В銆?br />
鍏蜂綋瀹炵幇鐨勬椂鍊欑粏鑺傚緢澶?#8230;…鐪熸姌紓ㄤ漢銆傝繕鏈夎娉ㄦ剰涓鴻妭鐪佺┖闂達紝F鏁扮粍瑕佸i榪欎竴緇存粴鍔ㄣ?br />
foodshop錛?br />
棣栧厛榪欐槸涓棤鍚戠幆濂楁爲錛堝叧浜庤繖鏂歸潰鐨勬葷粨瑙?a title=""榪欓噷"" href=""http://www.shnenglu.com/MatoNo1/archive/2012/09/01/189006.html"">榪欓噷錛?br />
鏋氫婦寮搴楃殑閭f潯杈癸紝濡傛灉鏄爲杈癸紝姹傚嚭璇ヨ竟鐨勮緝涓嬬粨鐐瑰線涓嬬殑鏈澶ч暱搴ist1錛屼互鍙婂線鍏跺畠緇撶偣鐨勬渶榪滆窛紱籨ist2錛屽垯緇撴灉鍗充負min{dist1+x, dist2+L-x}錛屾弧瓚?<=x<=L錛孡涓鴻杈歸暱搴︺俤ist1姹傛硶涓嶈浜嗭紝dist2鍒嗕負涓ら儴鍒嗭紝鏍戝唴鐨勶紝鍙互杞寲涓虹粡鍏窪P妯″瀷“鏍戠殑涓績鐐?#8221;錛涙爲澶栫殑錛屽厛姹傚嚭鐜笂鐨勬瘡涓粨鐐瑰線鏍戜腑璧扮殑鏈澶ч暱搴︼紝浣滀負榪欎釜緇撶偣鐨勬潈鍊鹼紝鐒跺悗灝辮漿鍖栦負涓涓甫杈規潈鍜岀偣鏉冪殑鐜紝瀵逛簬姣忎釜鐐筰錛屾眰鍑簃ax{i銆乯璺濈+j鐨勬潈鍊紏錛坖涓虹幆涓婄殑鐐癸級鐨勫鹼紝榪欎釜鍊煎彲浠ラ氳繃鍦ㄧ幆涓婃壂鎻忕殑鏂規硶姹傚嚭錛氳G&e1;i&e3;涓虹i涓偣鍑哄彂錛岄嗘椂閽堣蛋鏇翠紭鐨勪綅緗渶榪滃埌鍝噷銆傞嗘椂閽堟壂鎻忚繖涓幆錛岀劧鍚庢墍鏈夌殑G灝卞彲浠ュ湪綰挎ф椂闂村唴姹傚嚭錛屾眰鍑篏鍚庯紝瀵規瘡涓偣鍒嗗埆姹傚嚭鍏墮嗘椂閽堟洿浼樺尯涓庨『鏃墮拡鏇翠紭鍖哄唴鐨勬渶澶у鹼紙鍙互鍦ㄦ壂鎻忚繃紼嬩腑鐢ㄧ嚎孌墊爲緇存姢錛夛紝鍗沖彲瑙e喅榪欎釜闂銆?br />
濡傛灉寮搴楃殑杈瑰湪鐜笂錛岃鍏朵袱绔偣涓篿銆乯錛坕->j涓洪嗘椂閽堟柟鍚戯級銆傚緢瀹規槗鍙戠幇錛屽鏋滃湪榪欐潯杈逛笂寮搴楋紝鍒檍鐨勯嗘椂閽堟洿浼樺尯鍐呯殑鎵鏈夌偣涓瀹氭槸閫嗘椂閽堝埌榪欎釜搴楁洿榪戯紝i鐨勯『鏃墮拡鏇翠紭鍖哄唴鐨勬墍鏈夌偣涓瀹氭槸欏烘椂閽堝埌榪欎釜搴楁洿榪戯紝鑰屽叾瀹冪殑鐐瑰垯闇瑕侀澶栧垽鏂竴涓嬫槸欏烘椂閽堟洿榪戣繕鏄嗘椂閽堟洿榪戯紙鎬誨垽鏂鏁頒負綰挎э級銆傝繖鏍蜂篃鍙互鍊熷姪綰挎鏍戝湪鎵弿榪囩▼涓眰鍑烘瘡鏉$幆杈圭殑欏恒侀嗘椂閽堟洿浼樺尯錛屼粠鑰岃漿鍖栦負涓庢爲杈圭殑闂涓鏍風殑妯″瀷銆傛椂闂村鏉傚害O(NlogN)銆?br />
涓嶈繃錛屽浜庣幆杈癸紝榪樻湁涓縐嶆洿綆鍗曠殑鍋氭硶錛圤rz @hza錛夛細
浜屽垎鏈榪滆窛紱伙紙鍗崇粨鏋滐級D錛岀劧鍚庡浜庣幆涓婄殑鎵鏈夌偣錛屾壘鍒拌繖涓幆涓婂埌榪欎釜鐐硅窛紱誨ぇ浜庯紙D-榪欎釜鐐規爲閲岀殑鏈澶ф繁搴︼級鐨勭偣闆嗗悎錛堟樉鐒舵槸榪炵畫鐨勪竴孌靛姬錛夛紝瀵規墍鏈夌偣鐨勮繖縐嶅姬姹傚茍錛屽鏋滆兘瑕嗙洊鏁翠釜鐜紝鍒欐渶浼樿В<D錛屽惁鍒欐渶浼樿В>=D銆?br />
鏈矙鑼禗ay2鍏ㄦ毚鍔涳紝鍙嬁浜嗘毚鍔涘垎……瀵逛粯綣佺悙棰樼殑鑳藉姏澶急浜嗭紝浠g爜閲忎竴澶у氨鎮插墽……
錛堝悗鏉ュ彂鐜幫紝foodshop鐨勬毚鍔涢兘鍐欑柕浜嗗洤……鏋氫婦寮搴楃殑杈瑰悗搴旇鐢⊿PFA姹傛渶鐭礬錛屽洜涓哄垹鎺夌殑鍙兘鏄爲杈癸紝鍓╀笅鐨勪笉鏄爲……涓嶈繃鏁版嵁寮憋紝鏈ㄦ湁鍑虹幇榪欑鎯呭喌鍥?#8230;…錛?br />
鑷蟲NOI2013瀹屾寕銆?br />
———————————————————————————————————————————————————
銆愭葷粨 && 涓浜涙劅鎯熾?br />
浠庝笂闈㈠彲浠ョ湅鍑猴紝鏈矙鑼跺湪NOI2013涓嬌鐢ㄧ殑綆楁硶閮芥槸NOIP鏅強緇勪互鍐呴毦搴︾殑鍥э紙matrix鐨勭煩闃典箻娉曞彲鑳界暐楂樼駭涓浜涳紝浣嗘樉鐒朵篃涓嶈兘瓚呰繃NOIP闅懼害錛?#8230;…
榪欎簺綆楁硶閮芥槸鏈矙鑼跺湪2009騫翠互鍓嶅氨鎼炴噦鐨勶紝涔熷氨鏄錛屽悗4騫存帉鎻$殑鎵鏈夌畻娉曪紝榪欐閮芥湪鏈夌敤涓?#8230;…
鏈鍚庝竴嬈OI錛岀珶濡傛瀵屾湁鎴忓墽鎬?#8230;…灞呯劧鍙冩櫘鍙婄粍綆楁硶……
鍥捐銆侀珮綰ф暟鎹粨鏋勩佸瓧絎︿覆銆佸嚑浣曘佹暟璁恒佺粍鍚?#8230;…榪欐閮芥湪鏈夎冿紝榪欎篃鏄疦OI鍘嗗彶涓婄殑涓涓?#8220;鍒涗婦”浜嗗洤……
浣嗗敖綆″姝わ紝鏈矙鑼跺湪姝ゆNOI涓粛鐒舵毚闇插嚭浜嗚澶氶棶棰?#8230;…騫朵笉鏄瘮璧涙妧宸ч棶棰橈紝鑰屾槸騫蟲椂鍩嬩笅鐨勭ジ鏍?#8230;…
鎯抽涓嶅鐏墊椿錛屾壘涓嶅嚭棰樼洰闅愯棌鐨勭壒孌婃ц川錛岀壒孌婃儏鍐佃冭檻涓嶆竻妤氾紝鍐欎唬鐮侀熷害澶參……榪欎簺閮芥槸騫蟲椂涓嶅ソ濂藉仛棰橈紝澶╁ぉ棰撳簾鐨勭粨鏋?#8230;…
鍥犳錛岃繖嬈℃寕鎺夛紝涔熸槸鐞嗘墍搴斿綋鐨勪簨……
涓嶈繃錛屼笉綆¤偪涔堣錛岃繕鏄販榪涗簡闆嗚闃?#8230;…闆嗚闃熸槸涓涓柊鐨勫紑濮嬶紝姣忓ぉ閮介潰涓村法澶х殑鎸戞垬錛屽悓鏃舵瘡澶╅兘鑳藉緱鍒板法澶х殑鎻愰珮……
铏界劧鏈矙鑼剁幇鍦ㄥ緢寮憋紝搴斾粯闅鵑鐨勮兘鍔涜繕榪滆繙涓嶅錛屼絾緇忚繃榪欎竴騫寸殑璁粌錛岀浉淇″彲浠ユ敼鍙樿繖涓鍒囷紝灝藉揩鑴辮彍……
甯屾湜榪欒兘鏄竴涓漿鎶樼偣銆?br />
50錛?2錛?錛?錛?銆?/span>
@榧庣埛
@xudyh
@xyz111
@hzaskywalker(FFT)
@hzhwcmhf
@zhj
@楸間父
@sunzhouyi
浠ュ強浼楀铏愭帀count銆乸enman銆乫oodshop鐨勭鐘?#8230;…
]]>
鍏稿瀷鐨勪簩嬈¢掓帹/DP鐨勯鐩?br />棣栧厛錛岄鐩腑鐨?#8220;涓嶄究鍒╁?#8221;鎸囩殑鏄煇涓偣鍒版牴鐨勮礬寰勪笂鐨勬湪鏈夎閫夊畾閾捐鐩栫殑杈圭殑鏉℃暟銆?br />
絎竴闂細璁綟[i][0..2]鍒嗗埆涓哄綋瀛愭爲i涓粨鐐筰鐨勭姸鎬佷負涓嶅弬涓庨摼錛?錛夈佷綔涓烘煇閾劇鐐癸紙1錛夈佷綔涓烘煇閾句腑闂寸偣錛?錛夋椂錛屽瓙鏍慽涓殑緇撶偣鍒癷鐨勬渶灝忎笉渚垮埄鍊箋備負浜嗗緱鍒癋錛岄渶瑕佽绔婫[j][k(0..2)]琛ㄧず緇撶偣i鐨勫墠j媯靛瓙鏍戜腑錛屾湁k媯電殑鏍圭粨鐐逛笌緇撶偣i鎺ヤ笂鐨勬渶灝忕殑鏈澶т笉渚垮埄鍊箋傛樉鐒訛紝涓嶅拰i鎺ヤ笂鐨勶紝鐘舵佷負0銆?銆?閮借錛屼絾涓嶄究鍒╁艱鍔?錛岃屽拰i鎺ヤ笂鐨勭姸鎬佸彧鑳芥槸0鎴?錛屼笉鍔?銆?br />
闂鏄浜岄棶銆傜浜岄棶鐨勯毦鐐瑰湪浜庯紝褰搃鍙栧緱鏈灝忎笉渚垮埄鍊兼椂錛宨鐨勬瘡涓瓙緇撶偣騫墮潪閮藉彇鍒版渶灝忎笉渚垮埄鍊?/strong>銆備婦涓緥瀛愶紝緇撶偣i鐨勬渶灝忎笉渚垮埄鍊間負3錛屽畠鐨勬煇涓瓙緇撶偣j鐨勬渶灝忎笉渚垮埄鍊間負2錛屽垯褰搄涓巌鎺ヤ笂鏃訛紝瀛愭爲j鐨勫唴閮ㄦ棦鍙互鍙栦笉渚垮埄鍊間負2鐨勮В錛屼篃鍙互鍙栦笉渚垮埄鍊間負3鐨勮В銆傛墍浠ワ紝涓轟簡瑙e喅絎簩闂紝闇瑕佹眰鍑虹粨鐐筰鐨勬渶灝忎笉渚垮埄鍊間負x鐨勮В鐨勬繪暟銆?strong>涓囧垢鐨勬槸錛寈鐨勮寖鍥村茍涓嶆槸澶ぇ錛屽彲浠ヨ瘉鏄庯紝x涓嶄細瓚呰繃log3N錛堜笅鍙栨暣錛夛紝涔熷氨鏄綋N=100000鏃秞鏈澶т負10銆?/span>鍥犳錛屾渶鍚庝粛鐒朵笉浼歍鎺夈?br />
榪欓鐨勪竴涓惎紺哄氨鏄紝鍦ㄦ眰綾諱技浜?#8220;鏈浼樿В璁℃暟”鐨勯棶棰樹腑錛?span style="color: red">涓嶈璁や負褰撳悗闈㈢殑鐘舵佸彇寰楁渶浼樿В鏃訛紝鍓嶉潰鐨勭姸鎬佷竴瀹氬彇寰楁渶浼樿В銆?/strong>鍥犳錛屼笉鑳藉彧璁板綍鏌愮姸鎬佸彇寰楁渶浼樿В鐨勪釜鏁幫紝鑰岃璁板綍璇ョ姸鎬佸彇寰楁瘡涓涓彲琛岃В鏃剁殑涓暟銆?br />
浠g爜錛?
#include <stdio.h>
#include <stdlib.h>
#include <string.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++)
#define re2(i, l, r) for (int i=l; i<r; i++)
#define re3(i, l, r) for (int i=l; i<=r; i++)
#define rre(i, n) for (int i=n-1; i>=0; i--)
#define rre1(i, n) for (int i=n; i>0; i--)
#define rre2(i, r, l) for (int i=r-1; i>=l; i--)
#define rre3(i, r, l) for (int i=r; i>=l; i--)
#define ll long long
const int MAXN = 100010, MAXW = 11, INF = ~0U >> 2;
struct edge {
int a, b, pre, next;
} E0[MAXN * 3], E[MAXN << 1];
int n, m0, m, Q[MAXN], F[MAXN][3], G[MAXN][3], res1 = 0;
ll MOD, FS[MAXN][MAXW][3], S[MAXN][MAXW][3], res2 = 0;
bool vst[MAXN];
void init_d()
{
re(i, n) E0[i].pre = E0[i].next = E[i].pre = E[i].next = i; m0 = m = n;
}
void add_edge0(int a, int b)
{
E0[m0].a = a; E0[m0].b = b; E0[m0].pre = E0[a].pre; E0[m0].next = a; E0[a].pre = m0; E0[E0[m0].pre].next = m0++;
E0[m0].a = b; E0[m0].b = a; E0[m0].pre = E0[b].pre; E0[m0].next = b; E0[b].pre = m0; E0[E0[m0].pre].next = m0++;
}
void add_edge(int a, int b)
{
E[m].a = a; E[m].b = b; E[m].pre = E[a].pre; E[m].next = a; E[a].pre = m; E[E[m].pre].next = m++;
}
void init()
{
int _M; scanf("%d%d", &n, &_M); cin >> MOD; if (_M < n - 1) {res1 = res2 = -1; return;} init_d(); int a0, b0;
re2(i, 1, n) {scanf("%d%d", &a0, &b0); add_edge0(--a0, --b0);}
}
void prepare()
{
re(i, n) vst[i] = 0; Q[0] = 0; vst[0] = 1; int x, y;
for (int front=0, rear=0; front<=rear; front++) {
x = Q[front];
for (int p=E0[x].next; p != x; p=E0[p].next) {
y = E0[p].b;
if (!vst[y]) {vst[y] = 1; Q[++rear] = y; add_edge(x, y);}
}
}
re(i, n) if (!vst[i]) {res1 = -1; res2 = -1; return;}
}
inline int minv3(int s1, int s2, int s3)
{
int s0 = s1 <= s2 ? s1 : s2;
return s0 <= s3 ? s0 : s3;
}
inline int minv2(int s1, int s2)
{
return s1 <= s2 ? s1 : s2;
}
void solve()
{
int x, y, len, v1, v2, v01, v02; ll sum;
rre(i, n) {
x = Q[i]; len = 0; G[0][0] = 0; G[0][1] = G[0][2] = INF;
for (int p=E[x].next; p != x; p=E[p].next) {
y = E[p].b; len++;
v1 = minv3(F[y][0], F[y][1], F[y][2]) + 1; v2 = minv2(F[y][0], F[y][1]);
G[len][0] = v1 >= G[len - 1][0] ? v1 : G[len - 1][0];
v01 = v1 >= G[len - 1][1] ? v1 : G[len - 1][1];
v02 = v2 >= G[len - 1][0] ? v2 : G[len - 1][0];
G[len][1] = minv2(v01, v02);
v01 = v1 >= G[len - 1][2] ? v1 : G[len - 1][2];
v02 = v2 >= G[len - 1][1] ? v2 : G[len - 1][1];
G[len][2] = minv2(v01, v02);
}
re(j, 3) F[x][j] = G[len][j];
re(j, MAXW) {S[0][j][0] = 1; S[0][j][1] = S[0][j][2] = 0;} len = 0;
for (int p=E[x].next; p != x; p=E[p].next) {
y = E[p].b; len++;
re(j, MAXW) re(k, 3) {
S[len][j][k] = 0;
if (j) {
sum = 0; re(k0, 3) {sum += FS[y][j - 1][k0]; if (sum >= MOD) sum -= MOD;}
S[len][j][k] = (sum * S[len - 1][j][k]) % MOD;
}
if (k) {
sum = 0; re(k0, 2) {sum += FS[y][j][k0]; if (sum >= MOD) sum -= MOD;}
S[len][j][k] = (S[len][j][k] + sum * S[len - 1][j][k - 1]) % MOD;
}
}
}
re(j, MAXW) re(k, 3) FS[x][j][k] = S[len][j][k];
}
res1 = minv3(F[0][0], F[0][1], F[0][2]);
res2 = 0; re(i, 3) if (F[0][i] == res1) res2 += FS[0][F[0][i]][i]; res2 %= MOD;
}
void pri()
{
cout << res1 << endl << res2 << endl;
}
int main()
{
init();
if (!res1) prepare();
if (!res1) solve();
pri();
return 0;
}
]]>
]]>
銆?011騫?鏈?8鏃ャ?br />鐩墠浠g爜妗嗘灦錛圥rogram0.cpp錛夊凡緇忓畬鎴愩?br />NOI2011鍥綋瀵規姉璧涘畨寰介槦鐨勪唬鐮佸悕縐板垵姝ュ畾涓猴細Docx
————————————————————————————————————————————————————
銆?011騫?鏈?9鏃ャ?br />Docx I宸茬粡瀹屾垚錛屼唬鐮侀暱搴︼紙鍖呮嫭娉ㄩ噴錛変負5368Bytes
鐗堟湰璇存槑錛?br />錛?錛夊浼樺娍鍒嗘暟G鐨勮綆椾負G2.1鐗堟湰錛?br />錛?錛夊惎鍙戝嚱鏁拌繕姣旇緝寮憋紱
鐩墠鐢變簬嫻嬭瘎鏈洪棶棰橈紝鏆傛椂鏃犳硶嫻嬭瘯錛屽彧鏈夌湅鏅氫笂鐨勭粌涔犺禌浜嗐?br />————————————————————————————————————————————————————
銆?011騫?鏈?0鏃ャ?br />浠婂ぉ縐冪劧鍙戠幇浜咲ocx I鐨勪竴涓弗閲嶉敊璇細鍦ㄥ垽瀹氭槸鍚︽湁鐐稿脊鐨勬椂鍊欐妸true鍜宖alse寮勫弽浜嗭紝緇撴灉瀵艱嚧鐐稿脊鏍規湰鏃犳硶浣跨敤銆?br />鐜板湪鏀規帀浜嗕箣鍚庯紙浠嶇劧鍛藉悕涓篋ocx I錛夛紝TEST緇撴灉浠嶇劧涓嶆槸寰堢悊鎯籌紝鍙兘铏愬埆浜虹殑涓浜涘垵絳夌増鏈紝楂樼瓑鐗堟湰錛堟瘮濡傞偅涓?I Hate Zerg"鐨勭増鏈?錛夋牴鏈湪鏈夊姙娉曘?br />鐩墠姝e湪鏀硅繘鍚彂鍑芥暟錛屼簤鍙栧湪鏄庡ぉ涓嬪崍涔嬪墠鍑篋ocx II銆?br />————————————————————————————————————————————————————
銆?011騫?鏈?鏃ャ?br />鐪熸儕闄╋紒鏈鍚庢椂鍒葷粓浜庢壘鍒頒簡闂鎵鍦紝騫朵笖鎶奃ocx II緇忔渶鍚庝竴姝ユ敼榪涘緱鍒扮殑鐗堟湰鍛藉悕涓篋ocx III錛屾彁浜ゅ埌鎺掍綅璧涖?br />鏈鍚庣粨鏋?#8230;…榪樿錛岀3鍚?#8230;…鍙槸涓ラ噸鎬鐤戞湁寮虹渷鏁呮剰鏀炬按……
澶ф鏄庡ぉ姝e紡鍒嗙粍灝辮兘鍑烘潵浜?#8230;…
————————————————————————————————————————————————————
銆?011騫?鏈?鏃ャ?br />鍒嗙粍緇撴灉宸茬粡鍑烘潵錛屽畨寰介槦鐨勫艦鍔胯繕鏄瘮杈冩湁鍒╃殑……
濂戒簡錛屽湪8鏈?0鏃ヤ笅鍗堜互鍓嶉兘涓嶇敤鍐嶇鍥綋瀵規姉璧涗簡……鍏ㄥ姏鍐插埡涓漢绔炶禌……
————————————————————————————————————————————————————
銆?011騫?鏈?0鏃ャ?br />鍥綋瀵規姉璧涙渶鍚庡啿鍒恒?br />浠婂ぉ鎶婂嚑涓湴鏂圭殑緋繪暟鏀逛簡涓涓嬶紝涓浜涚湅璧鋒潵寰堝偦鐨勫喅絳栦篃寰楀埌浜嗕慨姝c備笉榪囨櫄涓婄粌涔犺禌鐨勭粨鏋滀粛鐒跺緢涓嶇悊鎯?#8230;…
綆椾簡錛屾槑澶?/4鍐寵禌絳夌潃琚媧楀惂鍥?#8230;…
鐜板湪榪樻湁涓鐐規椂闂達紝涔辨悶涓涓嬪惂鍥?#8230;…
————————————————————————————————————————————————————
銆?011騫?鏈?1鏃ャ?br />鏈緇堢粨鏋滐細鍏己錛?/4鍐寵禌涓婀栧崡琛媧?br />
鏄劇劧鏄竴涓鎯充箣涓殑緇撴灉……榪樻槸搴旈獙浜嗛偅鍙ヨ瘽錛氬洟浣撳鎶楄禌紕板埌婀栧崡灝辨槸鎵炬……
榪欐錛屾湰娌欒尪鐪熺殑宸茬粡灝藉姏浜?#8230;…
鏄庡勾鍐嶆潵鍚?#8230;…
]]>
]]>
闅懼害涓嶆槸寰堝ぇ錛屽氨鏄壒孌婃儏鍐墊瘮杈冨錛屾瘮杈冪尌鐞愶紙涓嶈繃鏈鏁版嵁寮憋紝灝辯畻涓嶈冭檻鎵鏈夌殑鐗規畩鎯呭喌涔熻兘榪?涓偣錛夈?br />棣栧厛O(NM)鐨勬湸绱犵畻娉曞緢濂芥兂鍒幫細鏋氫婦K錛岀劧鍚庣粰姣忎釜緇撶偣緙栧彿鍗沖彲銆傚湪緙栧彿鏃訛紝鍏堥殢渚挎寚瀹氫竴涓湭緙栧彿鐨勭偣錛岃瀹冪殑緙栧彿涓?錛岀劧鍚庨亶鍘嗘墍鏈夊拰瀹冪浉鍏寵仈鐨勮竟錛堣繖閲屽彲浠ユ妸鍘熷浘鎯寵薄鎴愪竴涓棤鍚戝浘錛夛紝灝嗚繖浜涜竟鐨勫彟涓涓鐐圭紪涓婂彿鍗沖彲錛屼腑闂磋嫢鏌愪釜鐐圭殑緙栧彿鍑虹幇鐭涚浘錛屽垯榪欎釜K涓嶅悎娉曪紝鍚﹀垯榪欎釜K鍚堟硶銆?br />鐒跺悗榪涜浼樺寲錛氬悎娉曠殑K瀹為檯涓婃槸鏈夐檺鍒剁殑錛屽畠蹇呯劧鏄煇涓暟鐨勫洜鏁幫紝鍏蜂綋鏉ヨ錛屽榪欎釜鍥捐繘琛孌FS錛屽茍鑰冨療鍏朵腑鎵鏈夌殑璺ㄨ秺杈瑰拰閫嗗悜杈癸紝瀵逛簬璺ㄨ秺杈?lt;i, j>錛岃閬嶅巻鏍戜腑i銆乯闂磋窛紱諱負D錛屽垯鍚堟硶鐨凨蹇呯劧鏄?D-1)鐨勫洜鏁幫紙鍥犱負i鍜岄亶鍘嗘爲涓璲鐨勭埗緇撶偣閮芥湁鎸囧悜j鐨勮竟錛屽畠浠殑緙栧彿搴旂浉鍚岋紝鑰屽畠浠箣闂寸殑璺濈涓?D-1)錛夛紱瀵逛簬閫嗗悜杈?lt;i, j>錛岃閬嶅巻鏍戜腑i銆乯闂磋窛紱諱負D'錛屽垯鍚堟硶鐨凨蹇呯劧鏄?D'+1)鐨勫洜鏁幫紙鍥犱負榪欓噷褰㈡垚浜嗕竴涓幆錛岀幆鐨勯暱搴︿負(D'+1)錛夈傝繖鏍蜂竴鏉ュ氨鏄庢樉緙╁皬浜咾鐨勫彇鍊艱寖鍥達紝鍐嶈繘琛屾灇涓撅紝灝卞彲浠ユ樉钁楃緝鐭椂闂淬?br />
涓嬮潰鏄竴浜涙瀬鍏剁尌鐞愮殑鐗規畩鎯呭喌錛?br />錛?錛夋牴鎹鎰忥紝蹇呴』鏄疜綾繪瘡綾婚兘鏈夛紝鍥犳鍦ㄥ皾璇曠紪鍙鋒垚鍔燂紙娌℃湁鍙戠敓浠諱綍鐭涚浘錛夊悗錛岃繕瑕佺湅涓涓?span style="color: red">瀹為檯鍑虹幇鐨勭紪鍙鋒暟鐩?/strong>鏄惁絳変簬K錛岃嫢灝忎簬K錛屽悓鏍蜂笉鍚堟硶錛?br />錛?錛夎鍥劇殑鍩哄浘鍙兘涓嶈繛閫氾紝姝ゆ椂瀵逛簬鍏跺熀鍥劇殑姣忎釜榪為氬潡錛屽叾緙栧彿浜掍笉褰卞搷錛屾墍浠ヨ瀵規瘡涓繛閫氬潡鍒嗗埆緇熻瀹為檯鍑虹幇鐨勭紪鍙鋒暟鐩紝璁懼畠浠殑鍜屼負SUM錛屽垯涓嶅ぇ浜嶴UM鐨凨鍊煎潎鍚堟硶錛堝彧瑕佷腑闂翠笉鍑虹幇鐭涚浘錛夛紝鍥犳鍙互鐩存帴寰楀埌鏈澶у間負SUM錛屾彁鍓嶇粨鏉燂紱涓嶈繃錛岃繖縐嶇壒鍒ゅ彧鏈夊湪鎬誨叡瀹為檯鍑虹幇鐨勭紪鍙鋒暟鐩皬浜嶬鐨勬儏鍐典笅鎵嶈兘榪涜錛?br />錛?錛夌敱浜庤冨療鐨勬槸瀹為檯鍑虹幇鐨勭紪鍙鋒暟鐩紝鍥犳鏈鍚庢眰鍑虹殑鏈澶у箋佹渶灝忓煎彲鑳藉皬浜?錛岃繖鏃跺簲浣滃嚭濡備笅澶勭悊錛氳嫢鏈澶у煎皬浜?錛屽垯鏃犺В錛涜嫢鏈灝忓煎皬浜?錛屽垯灝嗘渶灝忓兼敼涓?銆?br />
鏈姣旇緝鐚ョ悙鐨勬暟鎹槸絎?銆?銆?涓偣錛屽垎鍒嚭鐜頒簡涓婅堪鐨勭錛?錛夈侊紙2錛夈侊紙3錛夌鐗規畩鎯呭喌錛屾澶栵紝榪欎笁涓偣寤哄嚭鐨勫浘涓珶鐒舵病鏈変竴鏉¤法瓚婅竟鎴栭嗗悜杈癸紒
浠g爜錛?
#include <stdio.h>
using namespace std;
#define re(i, n) for (int i=0; i<n; i++)
#define re2(i, l, r) for (int i=l; i<r; i++)
#define re3(i, l, r) for (int i=l; i<=r; i++)
const int MAXN = 100000, MAXM = 1100001;
struct edge {
int a, b, s, pre, next;
} E0[MAXM], E[MAXM + MAXM];
int n, m0, m, P, len, X[MAXN], No[MAXN], stk[MAXN], st[MAXN], dep[MAXN], V[MAXN], fo[MAXN], Q[MAXN], res0, res1;
bool vst[MAXN], T0[MAXN];
long long T[MAXN], _Z = 0;
void init_d()
{
re(i, n) E[i].a = E[i].pre = E[i].next = E0[i].a = E0[i].pre = E0[i].next = i;
m0 = n; if (n % 2) m = n + 1; else m = n;
}
void add_edge(int a, int b)
{
E0[m0].a = a; E0[m0].b = b; E0[m0].pre = E0[a].pre; E0[m0].next = a; E0[a].pre = m0; E0[E0[m0].pre].next = m0++;
E[m].a = a; E[m].b = b; E[m].s = 1; E[m].pre = E[a].pre; E[m].next = a; E[a].pre = m; E[E[m].pre].next = m++;
E[m].a = b; E[m].b = a; E[m].s = -1; E[m].pre = E[b].pre; E[m].next = b; E[b].pre = m; E[E[m].pre].next = m++;
}
void init()
{
freopen("party.in", "r", stdin);
int _m, a, b; scanf("%d%d", &n, &_m); init_d();
re(i, _m) {
scanf("%d%d", &a, &b);
add_edge(--a, --b);
}
fclose(stdin);
}
int gcd(int a, int b)
{
int r;
while (b) {
r = a % b; a = b; b = r;
}
return a;
}
void prepare()
{
int tp, x, y, ord = 0;
bool fd;
re(i, n) V[i] = 0; P = 0;
re(i, n) if (!V[i]) {
stk[tp = 0] = i; fo[i] = ord++; V[i] = 1; st[i] = E0[i].next; dep[i] = 0;
while (tp >= 0) {
x = stk[tp]; fd = 0;
for (int p=st[x]; p != x; p=E0[p].next) {
y = E0[p].b;
if (!V[y]) {
stk[++tp] = y; fo[y] = ord++; V[y] = 1; st[y] = E0[y].next; dep[y] = dep[x] + 1; st[x] = E0[p].next; fd = 1; break;
} else if (V[y] == 1) P = gcd(P, dep[x] - dep[y] + 1); else if (fo[y] > fo[x]) P = gcd(P, dep[y] - dep[x] - 1);
}
if (!fd) {V[x] = 2; tp--;}
}
}
len = 0; re3(i, 3, n) if (!(P % i)) X[len++] = i;
}
int test(int K)
{
re(i, n) {vst[i] = 0; No[i] = -1;}
re(i, K) T0[i] = 0;
int x, y, No0, sum = 0, sum0 = 0;
re(i, n) if (!vst[i]) {
No[i] = 0; Q[0] = i; vst[i] = 1; _Z++; if (T[0] != _Z) {T[0] = _Z; sum++;} if (!T0[0]) {T0[0] = 1; sum0++;}
for (int front=0, rear=0; front<=rear; front++) {
x = Q[front];
for (int p=E[x].next; p != x; p=E[p].next) {
y = E[p].b; No0 = No[x] + E[p].s;
if (No0 == K) No0 = 0; else if (No0 == -1) No0 = K - 1;
if (No[y] >= 0 && No0 != No[y]) return -1; else {
No[y] = No0;
if (T[No0] != _Z) {T[No0] = _Z; sum++;}
if (!T0[No0]) {T0[No0] = 1; sum0++;}
}
if (!vst[y]) {vst[y] = 1; Q[++rear] = y;}
}
}
}
if (sum0 < K) res0 = sum;
return sum0;
}
void solve()
{
int K, K0; res0 = res1 = -1;
re(i, len) {
K = X[i]; K0 = test(K);
if (K0 != -1) {
if (res1 == -1) res1 = K0;
if (K0 < K) break; else res0 = K;
}
}
if (res0 < 3) res0 = res1 = -1; else if (res1 < 3) res1 = 3;
}
void pri()
{
freopen("party.out", "w", stdout);
printf("%d %d\n", res0, res1);
fclose(stdout);
}
int main()
{
init();
prepare();
solve();
pri();
return 0;
}
]]>
Splay Tree涔嬫墍浠ュ彲浠ュ綋綰挎鏍戠敤錛屾槸鍥犱負瀹冨彲浠ユ敮鎸佷竴涓簭鍒楋紝鐒跺悗鐢?#8220;宸︾鍓嶈秼浼稿睍鍒版牴錛屽彸绔悗緇т幾灞曞埌鏍圭殑鍙沖瓙緇撶偣錛屽彇鏍圭殑鍙沖瓙緇撶偣鐨勫乏瀛愮粨鐐?#8221;榪欑浼稿睍鏂規硶錛屽涓涓簭鍒椾腑鐨勪竴鏁存榪涜鏁翠綋鎿嶄綔銆傜敱浜庤闃叉鍑虹幇鍓嶈秼鎴栧悗緇т笉瀛樺湪鐨勬儏鍐碉紝闇瑕佸湪榪欎釜搴忓垪鐨勪袱绔姞鍏ヤ袱涓竟鐣岀粨鐐癸紝瑕佹眰鍏跺間笉鑳藉獎鍝嶅埌緇撶偣鍚勭璁拌澆淇℃伅鐨勭淮鎶わ紙澶氬彇0銆?#8734;鎴?∞錛夈傝繖涓や釜杈圭晫緇撶偣鍦ㄦ爲涓案榪滃瓨鍦紝涓嶄細琚垹闄ゃ?br />
錛?錛夌粨鐐圭殑寮曠敤錛?br />鍦ㄥ綋綰挎鏍戠敤鐨凷play Tree涓紝鐪熸鐨勫叧閿瓧鏄笅鏍囪屼笉鏄鹼紝鍥犳錛?#8220;搴忓垪涓i涓粨鐐?#8221;瀹為檯涓婂搴旂殑鏄?#8220;鏍戜腑絎?i+1)灝忕殑緇撶偣”錛堝洜涓哄乏杈硅繕鏈変竴涓竟鐣岀粨鐐癸級錛岃繖灝辮鏄庡湪瀵圭粨鐐瑰紩鐢ㄦ椂闇瑕佹壘絎琄灝忕殑鎿嶄綔銆傚洜姝わ紝涓嬮潰鐨?#8220;緇撶偣x”鎸囩殑鏄?#8220;鏍戜腑絎?x+1)灝忕殑緇撶偣”銆?br />錛?錛夋爣璁幫細
鍦ㄧ嚎孌墊爲涓紝濡傛灉瀵逛竴涓粨鐐規墍琛ㄧず鐨勭嚎孌墊暣浣撹繘琛屼簡鏌愮鎿嶄綔錛岄渶瑕佸湪榪欎釜緇撶偣涓婃墦涓婁竴涓爣璁幫紝鍦ㄤ笅涓嬈″啀鎵懼埌榪欎釜緇撶偣鏃訛紝鍏舵爣璁板氨浼氫笅鏀懼埌鍏朵袱涓瓙緇撶偣涓娿傚湪Splay Tree涓篃鍙互寮曞叆鏍囪銆傛瘮濡傝瀵筟2, 6]榪欎竴孌佃繘琛屾暣浣撴搷浣滐紝灝卞皢緇撶偣1浼稿睍鍒版牴鐨勪綅緗紝灝嗙粨鐐?浼稿睍鍒版牴鐨勫彸瀛愭爲鐨勪綅緗紝鐒跺悗緇撶偣7鐨勫乏瀛愭爲灝辮〃紺篬2, 6]榪欎竴孌碉紝瀵硅繖媯靛瓙鏍戠殑鏍圭粨鐐規墦涓婃爣璁板茍绔嬪嵆鐢熸晥錛堝繀欏繪槸绔嬪嵆鐢熸晥錛岃屼笉鏄瓑涓嬩竴嬈″紩鐢ㄥ啀鐢熸晥錛夛紝涔熷氨鏄珛鍗蟲敼鍙樿緇撶偣璁板綍鐨勪竴浜涗俊鎭殑鍊箋傚鏋滀笅嬈″啀嬈″紩鐢ㄥ埌榪欎釜緇撶偣錛屽氨瑕佸皢鍏舵爣璁頒笅鏀懼埌鍏朵袱涓瓙緇撶偣澶勶紱
闇瑕佹敞鎰忕殑涓鐐規槸錛屽鏋滆浼稿睍鏌愪釜緇撶偣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 />錛?錛夊洖鏀剁┖闂達細
鏍規嵁鏈鐨勬暟鎹寖鍥存彁紺猴紝鎻掑叆鐨勭粨鐐規繪暟鏈澶氬彲鑳借揪鍒?000000錛屼絾鍦ㄤ換浣曟椂鍒繪爲涓渶澶氬彧鏈?00002涓粨鐐癸紙鍖呮嫭涓や釜杈圭晫錛夛紝姝ゆ椂涓轟簡鑺傜渷絀洪棿錛屽彲浠ラ噰鐢ㄥ驚鐜槦鍒楀洖鏀剁┖闂寸殑鏂規硶銆傚嵆錛氫竴寮濮嬪皢鎵鏈夌殑鍙敤絀洪棿錛堝彲鐢ㄤ笅鏍囷紝鏈涓?~500002錛夊瓨鍦ㄥ驚鐜槦鍒桻閲岋紝鍚屾椂璁劇珛澶村熬鎸囬拡front鍜宺ear錛屾瘡嬈″鏋滄湁鏂扮粨鐐規彃鍏ワ紝灝卞彇鍑篞[front]騫朵綔涓烘柊緇撶偣鐨勪笅鏍囷紝濡傛灉鏈夌粨鐐硅鍒犻櫎錛堟湰棰樻槸涓嬈″垹闄ゆ暣媯靛瓙鏍戯紝鍥犳鍦ㄥ垹闄ゅ悗闇瑕佸垎鍒洖鏀跺畠浠殑絀洪棿錛夛紝鍒欎粠rear寮濮嬶紝灝嗘瘡涓垹闄ょ殑緇撶偣鐨勪笅鏍囨斁鍥炲埌Q閲屻傚綋鐒訛紝榪欑鏂規硶鏄鐗虹壊涓瀹氱殑鏃墮棿鐨勶紝鍥犳鍦ㄧ┖闂翠笉鏄壒鍒悆绱х殑鎯呭喌涓嬩笉瑕佺敤銆?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 />
]]>
]]>