锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
A鐨勫乏瀛愮粨鐐癸細(xì)2A錛堝啓鎴怉<<1錛?br />A鐨勫彸瀛愮粨鐐癸細(xì)2A+1錛堝啓鎴?A<<1)+1錛?br />榪欑琛ㄧず娉曞彲浠ヨ〃紺哄嚭鏁存5綰挎鏍?wèi)锛屽洜湄?fù)錛?br />錛?錛夋瘡涓粨鐐圭殑瀛愮粨鐐圭殑涓嬫爣閮芥瘮瀹冨ぇ錛岃繖鏍峰氨涓嶄細(xì)鍑虹幇鐜紱
錛?錛夋瘡涓粨鐐圭殑鐖剁粨鐐歸兘鏄敮涓鐨勶紙鍏舵湰韜笅鏍囨暣闄?錛夛紱
浣嗘槸錛岃繖縐嶈〃紺烘硶鏈変竴涓急鐐癸細(xì)緇撶偣鐨勪笅鏍囨槸鏈夊彲鑳借秴榪?N鐨勶紝浣嗕笉浼?xì)瓒厴q?N錛屽洜姝わ紝涓轟簡(jiǎn)琛ㄧず鍑?guó)櫡ㄥ害湄?fù)N鐨勭嚎孌碉紝鎴戜滑闇瑕佸紑4N鐨勭┖闂達(dá)紝鐒惰岋紝鍏朵腑鍙湁2N-1涓綅緗槸鏈夌敤鐨勶紙鍥犱負(fù)琛ㄧず璺ㄥ害涓篘鐨勭嚎孌電殑綰挎鏍?wèi)鍏辨?2N-1)涓粨鐐癸級(jí)錛?span style="color: red">榪欐牱錛屽氨鏈変竴鍗婄殑絀洪棿琚氮璐?/strong>銆傚挨鍏舵槸榪欑綰挎鏍?wèi)鎺q垮埌澶氱淮鐨勬椂鍊?#8212;—K緇寸嚎孌墊爲(wèi)灝卞彧鏈?/2K鐨勪綅緗槸鏈夌敤鐨勶紝絀洪棿鍒╃敤鐜囬潪甯鎬綆銆傚湪鏌愪簺鍗$┖闂寸殑鍦哄悎錛屽畠?yōu)鍥ф帀浜?jiǎn)銆?br />
閭d箞錛屾湁鏈ㄦ湁濂戒竴鐐圭殑鍐欐硶鍛紵鏈濂借兘浣跨┖闂村埄鐢ㄧ巼杈懼埌100%——涔熷氨鏄墍鏈夌粨鐐圭殑涓嬫爣鍒氬ソ灝辨槸1~(2N-1)錛侊紒錛?鍙風(fēng)粨鐐逛竴鑸綔涓?#8220;鍝ㄥ叺”錛屼笉琚崰鐢級(jí)
騫朵笖錛岃繖縐嶅啓娉曡淇濊瘉浠呬粎鐢辯粨鐐圭殑涓嬫爣鍜屽畠琛ㄧず鐨勭嚎孌電殑宸﹀彸绔偣錛堝洜涓哄湪閬嶅巻綰挎鏃訛紝涓嬫爣鍜屽乏鍙崇鐐瑰熀鏈笂閮芥槸鍚屾椂鐭ラ亾鐨勶級(jí)錛屽氨鑳藉緱鍑哄叾瀛愮粨鐐圭殑涓嬫爣錛岃屼笉闇瑕佸熷姪棰濆鐨勪笢涓滐紙鏈濂絤id閮戒笉闇瑕佺畻錛夈?br />榪欑鍐欐硶灝辨槸——鐩存帴灝嗘瘡涓粨鐐圭殑DFS閬嶅巻嬈″簭褰撳仛瀹冪殑涓嬫爣錛侊紒
姣斿錛岃法搴︿負(fù)6鐨勭嚎孌墊爲(wèi)錛?br />
瀹規(guī)槗鍙戠幇錛屾牴緇撶偣涓嬫爣涓?錛屼笅鏍囦負(fù)A鐨勭粨鐐圭殑宸﹀瓙緇撶偣涓嬫爣涓?A+1)錛屽彸瀛愮粨鐐逛笅鏍囦負(fù)A+SZ(A.L)+1錛屽叾涓璖Z(A.L)涓篈鐨勫乏瀛愭爲(wèi)澶у皬銆?br />鑻鐨勫乏鍙崇鐐逛負(fù)l銆乺錛宮id=(l+r)/2錛堜笅鍙栨暣錛夛紝鍒橝鐨勫乏瀛愭爲(wèi)鎵琛ㄧず鐨勭嚎孌典負(fù)[l, mid]錛屾墍浠Z(A.L)=(mid-l+1)*2-1=(mid-l)*2+1=((r-l-1)/2錛堜笂鍙栨暣錛?*2+1
榪欐牱錛孉鐨勫彸瀛愮粨鐐逛笅鏍囧氨鏄疉+((r-l+1)/2錛堜笂鍙栨暣))*2錛屼篃灝辨槸A鍔犱笂澶т簬(r-l)鐨勬渶灝忕殑鍋舵暟錛?br />鍐欏湪浠g爜閲屽氨鏄細(xì)
opr(l, mid, A+1);
opr(mid+1, r, (r-l&1?A+r-l+1:A+r-l+2));
opr(l, mid, A+1);
opr(mid+1, r, A+r-l+2-((r^l)&1));
榪欐牱錛屾垜浠氨鎴愬姛鍦板皢綰挎鏍?wèi)涓嬫爣鐨劷I洪棿鍒╃敤鐜囨彁楂樺埌浜?00%錛侊紒浠ュ悗鍙渶瑕佸紑2N絀洪棿灝辮浜?jiǎn)鍥?#8230;…
涓庝紶緇熻〃紺烘硶鐩告瘮錛岃繖縐嶆柊寮忚〃紺烘硶铏界劧鍙互鑺傜渷絀洪棿錛屼絾鏃墮棿娑堣楄鏇村ぇ涓浜涳紙鏃墮棿鍜岀┖闂存繪槸鐭涚浘鐨勫洤……錛夛紝鍥犱負(fù)瀹冨湪鎵懼彸瀛愮粨鐐圭殑鏃跺欓渶瑕佽緝澶氱殑榪愮畻銆傚鉤鍧囪搗鏉ワ紝鏂板紡琛ㄧず娉曟瘮浼犵粺琛ㄧず娉曡鎱?0~15%錛屽浜庢煇浜涘潙鐖圭殑鏁版嵁錛堝鍙沖瓙緇撶偣璋冪敤姣旇緝澶氱殑閭g錛夊彲鑳芥參寰楁洿澶氥傛澶栵紝鍦ㄤ笅鏀炬爣璁扮殑鏃跺欙紝浼犵粺琛ㄧず娉曞彧闇瑕佺煡閬撶粨鐐逛笅鏍囧氨琛屼簡(jiǎn)錛岃屾柊寮忚〃紺烘硶蹇呴』鍚屾椂鐭ラ亾緇撶偣鐨勫乏鍙崇鐐癸紝榪欐牱鍦╠m涓氨闇瑕佷紶閫掍笁涓弬鏁幫紝浠庤岃鎱竴浜涳紝褰撶劧錛屾垜浠彲浠ヤ笉鐢╠m錛岀洿鎺ュ湪鎿嶄綔閲岄潰鍐欐爣璁頒笅鏀俱?img src ="http://m.shnenglu.com/MatoNo1/aggbug/195857.html" width = "1" height = "1" />
]]>
Splay Tree涔嬫墍浠ュ彲浠ュ綋綰挎鏍?wèi)鐢ㄥQ屾槸鍥犱負(fù)瀹冨彲浠ユ敮鎸佷竴涓簭鍒楋紝鐒跺悗鐢?#8220;宸︾鍓嶈秼浼稿睍鍒版牴錛屽彸绔悗緇т幾灞曞埌鏍圭殑鍙沖瓙緇撶偣錛屽彇鏍圭殑鍙沖瓙緇撶偣鐨勫乏瀛愮粨鐐?#8221;榪欑浼稿睍鏂規(guī)硶錛屽涓涓簭鍒椾腑鐨勪竴鏁存榪涜鏁翠綋鎿嶄綔銆傜敱浜庤闃叉鍑虹幇鍓嶈秼鎴栧悗緇т笉瀛樺湪鐨勬儏鍐碉紝闇瑕佸湪榪欎釜搴忓垪鐨勪袱绔姞鍏ヤ袱涓竟鐣岀粨鐐癸紝瑕佹眰鍏跺間笉鑳藉獎(jiǎng)鍝嶅埌緇撶偣鍚勭璁拌澆淇℃伅鐨勭淮鎶わ紙澶氬彇0銆?#8734;鎴?∞錛夈傝繖涓や釜杈圭晫緇撶偣鍦ㄦ爲(wèi)涓案榪滃瓨鍦紝涓嶄細(xì)琚垹闄ゃ?br />
錛?錛夌粨鐐圭殑寮曠敤錛?br />鍦ㄥ綋綰挎鏍?wèi)鐢ㄧ殑Splay Tree涓紝鐪熸鐨勫叧閿瓧鏄笅鏍囪屼笉鏄鹼紝鍥犳錛?#8220;搴忓垪涓i涓粨鐐?#8221;瀹為檯涓婂搴旂殑鏄?#8220;鏍?wèi)涓W?i+1)灝忕殑緇撶偣”錛堝洜涓哄乏杈硅繕鏈変竴涓竟鐣岀粨鐐癸級(jí)錛岃繖灝辮鏄庡湪瀵圭粨鐐瑰紩鐢ㄦ椂闇瑕佹壘絎琄灝忕殑鎿嶄綔銆傚洜姝わ紝涓嬮潰鐨?#8220;緇撶偣x”鎸囩殑鏄?#8220;鏍?wèi)涓W?x+1)灝忕殑緇撶偣”銆?br />錛?錛夋爣璁幫細(xì)
鍦ㄧ嚎孌墊爲(wèi)涓紝濡傛灉瀵逛竴涓粨鐐規(guī)墍琛ㄧず鐨勭嚎孌墊暣浣撹繘琛屼簡(jiǎn)鏌愮鎿嶄綔錛岄渶瑕佸湪榪欎釜緇撶偣涓婃墦涓婁竴涓爣璁幫紝鍦ㄤ笅涓嬈″啀鎵懼埌榪欎釜緇撶偣鏃訛紝鍏舵爣璁板氨浼?xì)涓嬫攽謭板叾涓や釜瀛惥l撶偣涓娿傚湪Splay Tree涓篃鍙互寮曞叆鏍囪銆傛瘮濡傝瀵筟2, 6]榪欎竴孌佃繘琛屾暣浣撴搷浣滐紝灝卞皢緇撶偣1浼稿睍鍒版牴鐨勪綅緗紝灝嗙粨鐐?浼稿睍鍒版牴鐨勫彸瀛愭爲(wèi)鐨勪綅緗紝鐒跺悗緇撶偣7鐨勫乏瀛愭爲(wèi)灝辮〃紺篬2, 6]榪欎竴孌碉紝瀵硅繖媯靛瓙鏍?wèi)鐨勬牴缁撶傄?guī)墦涓婃爣璁板茍绔嬪嵆鐢熸晥錛堝繀欏繪槸绔嬪嵆鐢熸晥錛岃屼笉鏄瓑涓嬩竴嬈″紩鐢ㄥ啀鐢熸晥錛夛紝涔熷氨鏄珛鍗蟲(chóng)敼鍙樿緇撶偣璁板綍鐨勪竴浜涗俊鎭殑鍊箋傚鏋滀笅嬈″啀嬈″紩鐢ㄥ埌榪欎釜緇撶偣錛屽氨瑕佸皢鍏舵爣璁頒笅鏀懼埌鍏朵袱涓瓙緇撶偣澶勶紱
闇瑕佹敞鎰忕殑涓鐐規(guī)槸錛屽鏋滆浼稿睍鏌愪釜緇撶偣x鍒皉鐨勫瓙緇撶偣鐨勪綅緗紝灝卞繀欏諱繚璇佷粠x鍘熸潵鐨勪綅緗埌r鐨勮繖涓瓙緇撶偣錛坸浼稿睍鍚庣殑浣嶇疆錛変笂鐨勬墍鏈夌粨鐐逛笂鍧囨病鏈夋爣璁幫紝鍚﹀垯灝變細(xì)瀵艱嚧鏍囪娣蜂貢銆傚洜姝わ紝蹇呴』棣栧厛鎵懼埌榪欎釜緇撶偣x錛屽湪姝よ繃紼嬩腑涓嶆柇涓嬫斁鏍囪銆?br />錛?錛夎嚜搴曞悜涓婄淮鎶ょ殑淇℃伅錛?br />鏍囪鍙互鐪嬫垚涓縐嶈嚜欏跺悜涓嬬淮鎶ょ殑淇℃伅銆傞櫎浜?jiǎn)鏍囪C互澶栵紝浣滀負(fù)“綰挎鏍?#8221;錛屽線寰榪樿緇存姢涓浜涜嚜搴曞悜涓婄淮鎶ょ殑淇℃伅銆傛瘮濡傚湪sequence榪欓?shù)腑锛尀鏈塴max錛堝乏孌佃繛緇渶澶у拰錛夈乺max錛堝彸孌佃繛緇渶澶у拰錛夈乵idmax錛堝叏孌佃繛緇渶澶у拰錛変互鍙?qiáng)sum錛堝叏孌墊誨拰錛夌瓑淇℃伅瑕佺淮鎶ゃ傚浜庤繖綾諱笢涓滃叾瀹炰篃寰堝ソ鍔烇紝鍥犱負(fù)瀛愭爲(wèi)澶у皬錛坰z鍩燂級(jí)灝辨槸涓縐嶈嚜搴曞悜涓婄淮鎶ょ殑淇℃伅錛屽洜姝ゅ浜庤繖浜涗俊鎭彧瑕佹寜鐓х淮鎶z鍩熺殑鍔炴硶緇存姢鍗沖彲錛堢粺涓鍐欏湪upd鍑芥暟閲岋級(jí)銆傚敮涓鐨勪笉鍚岀偣鏄墦鏍囪鏃跺畠浠殑鍊煎彲鑳借鏀瑰彉銆?br />錛?錛夊榪炵畫(huà)鎻掑叆鐨勭粨鐐瑰緩鏍?wèi)锛?xì)
鏈鐨勬彃鍏ヤ笉鏄竴涓竴涓彃鍏ワ紝鑰屾槸涓涓嬪瓙鎻掑叆涓鏁存錛屽洜姝ら渶瑕佸厛灝嗗畠浠緩鎴愪竴媯墊爲(wèi)銆備竴鑸緩鏍?wèi)鎿嶄綔閮芥槸閫掑綊鐨勶紝榪欓噷涔熶竴鏍楓傝鐩墠瑕佸A[l..r]寤烘爲(wèi)錛圓涓哄緟鎻掑叆搴忓垪錛夛紝鑻>r鍒欓鍑猴紝鍚﹀垯鎵懼埌浣嶄簬涓棿鐨勫厓绱爉id = l + r >> 1錛屽皢A[mid]浣滄牴錛屽啀瀵笰[l..mid-1]寤哄乏瀛愭爲(wèi)錛屽A[mid+1..r]寤哄彸瀛愭爲(wèi)鍗沖彲銆傝繖鏍峰彲浠ヤ繚璇佷竴寮濮嬪緩鐨勫氨鏄竴媯靛鉤琛℃爲(wèi)錛屽噺灝忓父鏁板洜瀛愩?br />錛?錛夊洖鏀剁┖闂達(dá)細(xì)
鏍規(guī)嵁鏈鐨勬暟鎹寖鍥存彁紺猴紝鎻掑叆鐨勭粨鐐規(guī)繪暟鏈澶氬彲鑳借揪鍒?000000錛屼絾鍦ㄤ換浣曟椂鍒繪爲(wèi)涓渶澶氬彧鏈?00002涓粨鐐癸紙鍖呮嫭涓や釜杈圭晫錛夛紝姝ゆ椂涓轟簡(jiǎn)鑺傜渷絀洪棿錛屽彲浠ラ噰鐢ㄥ驚鐜槦鍒楀洖鏀剁┖闂寸殑鏂規(guī)硶銆傚嵆錛氫竴寮濮嬪皢鎵鏈夌殑鍙敤絀洪棿錛堝彲鐢ㄤ笅鏍囷紝鏈?shù)?~500002錛夊瓨鍦ㄥ驚鐜槦鍒桻閲岋紝鍚屾椂璁劇珛澶村熬鎸囬拡front鍜宺ear錛屾瘡嬈″鏋滄湁鏂扮粨鐐規(guī)彃鍏ワ紝灝卞彇鍑篞[front]騫朵綔涓烘柊緇撶偣鐨勪笅鏍囷紝濡傛灉鏈夌粨鐐硅鍒犻櫎錛堟湰棰樻槸涓嬈″垹闄ゆ暣媯靛瓙鏍?wèi)锛屽洜姝ゅ湪鍒犻櫎鍚庨渶瑕佸垎鍒洖鏀跺畠浠殑絀洪棿錛夛紝鍒欎粠rear寮濮嬶紝灝嗘瘡涓垹闄ょ殑緇撶偣鐨勪笅鏍囨斁鍥炲埌Q閲屻傚綋鐒?dòng)灱寴q欑鏂規(guī)硶鏄鐗虹壊涓瀹氱殑鏃墮棿鐨勶紝鍥犳鍦ㄧ┖闂翠笉鏄壒鍒悆绱х殑鎯呭喌涓嬩笉瑕佺敤銆?br />
銆?012騫?鏈?6鏃ユ洿鏂般?br />浠婂ぉ閲嶅啓sequence鐨勬椂鍊欙紝縐冪劧鍙戠幇鍔犲叆鐨勮竟鐣岀偣鍙兘浼?xì)瀵筶max銆乺max銆乵idmax絳夌殑緇存姢閫犳垚褰卞搷錛氬綋搴忓垪涓墍鏈夌殑鍊奸兘鏄礋鏁版椂錛岃嫢杈圭晫鐐圭殑鍊艱涓?錛屽皢浣胯繖3涓間篃涓?錛屾墍浠ワ紝杈圭晫鐐圭殑鍊煎簲璁句負(fù)-INF錛堜笉浼?xì)濯?jiǎng)鍝嶅埌sum錛屽洜涓哄彲浠ュ崟鐙皟鍑篬l, r]鐨剆um錛岄伩寮杈圭晫錛夈傝繖灝辮鏄庡茍闈炴墍鏈夎繖鏍風(fēng)殑棰樹(shù)腑閮藉彲浠ヨ緗竟鐣岀偣錛堟瘮濡侶FTSC2011鐨勯偅棰樺氨涓嶈錛夛紝濡傛灉杈圭晫鐐逛細(xì)瀵圭淮鎶ょ殑淇℃伅閫犳垚褰卞搷錛屽氨涓嶈兘璁劇疆杈圭晫鐐癸紝鍦ㄥ悇涓搷浣滀腑錛屽垎4縐嶆儏鍐靛垽鏂傦紙浠g爜宸茬粡淇敼錛?br />
涓嬮潰涓婁唬鐮佷簡(jiǎn)錛?
#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紲炵妵鐨勬湰棰樹(shù)唬鐮佽繘琛屾祴璇曟瘮杈冿紝緇撴灉錛圔YVoid紲炵妵鐨勪唬鐮佽榪欓噷錛夛細(xì)
BYVoid紲炵妵鐨勶細(xì)
鏈矙鑼剁殑錛?br />
銆愮浉鍏寵鏂囥?br />
]]>
榪欐牱錛屽浜庢湰棰樺氨鏈変袱縐嶇畻娉曚簡(jiǎn)錛氾紙浠ヤ笅鐨凾鍏ㄩ儴鎸嘒鐨勬渶灝忕敓鎴愭爲(wèi)錛?br />錛?錛塒rim錛?br />璁劇珛鏁扮粍F錛孎[x][y]琛ㄧずT涓粠x鍒皔璺緞涓婄殑鏈澶ц竟鐨勬潈鍊箋侳鏁扮粍鍙互鍦ㄧ敤Prim綆楁硶姹傛渶灝忕敓鎴愭爲(wèi)鐨勮繃紼嬩腑寰楀嚭銆傛瘡嬈″皢杈?i, j)鍔犲叆鍚庯紙j鏄柊鍔犲叆鏍?wèi)鐨勮竟锛宨=c[j]錛夛紝鏋氫婦鏍?wèi)涓師鏈夌殑姣忎釜鐐筴錛堝寘鎷琲錛屼絾涓嶅寘鎷琷錛夛紝鍒橣[k][j]=max{F[k][i], (i, j)杈規(guī)潈鍊紏錛屽張鐢變簬F鏁扮粍鏄縐扮殑錛屽彲浠ュ緱鍒癋[j][k]=F[k][j]銆傜劧鍚庡崈涓囪浣忓皢鍥綠涓殑杈?i, j)鍒犻櫎錛堝氨鏄皢閭繪帴鐭╅樀涓?i, j)杈規(guī)潈鍊兼敼涓?#8734;錛夛紒鍥犱負(fù)T涓殑杈規(guī)槸涓嶈兘琚姞鍏ョ殑銆傜瓑T琚眰鍑哄悗錛屾墍鏈夌殑F鍊間篃姹傚嚭浜?jiǎn)锛岀劧鍚庡Q屾灇涓劇偣i銆乯錛岃嫢閭繪帴鐭╅樀涓竟(i, j)鏉冨間笉鏄棤絀峰ぇ錛堣繖璇存槑i銆乯闂村瓨鍦ㄤ笉鍦═涓殑杈癸級(jí)錛屽垯姹傚嚭{(i, j)杈規(guī)潈鍊?- F[i][j]}鐨勫鹼紝鍗充負(fù)鍔犲叆杈?i, j)鐨勪唬浠鳳紝姹傛渶灝忕殑鎬諱唬浠峰嵆鍙?br />鍙﹀娉ㄦ剰涓夌鐗規(guī)畩鎯呭喌錛氥?銆戝浘G涓嶈繛閫氾紝姝ゆ椂鏈灝忕敓鎴愭爲(wèi)鍜屾灝忕敓鎴愭爲(wèi)鍧囦笉瀛樺湪銆傚垽瀹氭柟娉曪細(xì)鍦ㄦ墿灞昑鐨勮繃紼嬩腑鎵句笉鍒版柊鐨勫彲浠ュ姞鍏ョ殑杈癸紱銆?銆戝浘G鏈韓灝辨槸涓媯墊爲(wèi)錛屾鏃舵渶灝忕敓鎴愭爲(wèi)瀛樺湪錛堝氨鏄疓鏈韓錛変絾嬈″皬鐢熸垚鏍?wèi)涓嶅瓨鍦ㄣ傚垽瀹氭柟娉曪細(xì)鍦ㄦ垚鍔熸眰鍑篢鍚庯紝鍙戠幇閭繪帴鐭╅樀涓殑鍊煎叏閮ㄦ槸鏃犵┓澶э紱銆?銆戝浘G瀛樺湪騫寵杈廣傝繖縐嶆儏鍐墊渶楹葷儲(chǔ)錛屽洜涓鴻繖鏃朵唬浠鋒渶灝忕殑鍙鍙樻崲(-E1, +E2)涓紝E1鍜孍2鍙兘鏄鉤琛岃竟錛佸洜姝わ紝鍙湁寤虹珛涓や釜閭繪帴鐭╅樀錛屽垎鍒瓨鍌ㄦ瘡涓ょ偣闂存潈鍊兼渶灝忕殑杈瑰拰鏉冨兼灝忕殑杈圭殑鏉冨鹼紝鐒跺悗錛屾瘡褰撲竴鏉℃柊杈?i, j)鍔犲叆鏃訛紝涓嶆槸灝嗛偦鎺ョ煩闃典腑杈?i, j)鏉冨兼敼涓烘棤絀峰ぇ錛岃屾槸鏀逛負(fù)榪炴帴鐐筰銆乯鐨勬潈鍊兼灝忕殑杈圭殑鏉冨箋?br />
浠g爜錛?
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++)
const int MAXN = 7000, INF = ~0U >> 2;
int n, s[MAXN][MAXN], s2[MAXN][MAXN], f[MAXN][MAXN], c[MAXN], v[MAXN], res1 = 0, res2 = 0;
bool vst[MAXN];
void init()
{
freopen("mst.in", "r", stdin);
scanf("%d", &n);
re(i, n) re(j, n) s[i][j] = s2[i][j] = INF;
int m, a, b, len;
scanf("%d", &m);
if (!m) {
if (n > 1) res1 = -INF; res2 = -INF;
return;
}
re(i, m) {
scanf("%d%d%d", &a, &b, &len); a--; b--;
if (len < s[a][b]) {s2[a][b] = s2[b][a] = s[a][b]; s[a][b] = s[b][a] = len;} else if (len < s2[a][b]) s2[a][b] = s2[b][a] = len;
}
fclose(stdin);
}
void solve()
{
re(i, n) {f[i][i] = c[i] = vst[i] = 0; v[i] = s[0][i];} vst[0] = 1;
int l0, l1 = INF, x, y, z;
re2(i, 1, n) {
l0 = INF; re(j, n) if (!vst[j] && v[j] < l0) {l0 = v[j]; x = j; y = c[j];}
if (l0 == INF) {res1 = res2 = -INF; return;}
vst[x] = 1; res1 += l0; s[x][y] = s[y][x] = INF; if (s2[x][y] < INF && s2[x][y] - l0 < l1) l1 = s2[x][y] - l0;
re(j, n) if (!vst[j] && s[x][j] < v[j]) {v[j] = s[x][j]; c[j] = x;}
re(j, n) if (vst[j] && j != x) f[j][x] = f[x][j] = max(f[j][y], l0);
}
re(i, n-1) re2(j, i+1, n) if (s[i][j] < INF) {
z = s[i][j] - f[i][j];
if (z < l1) l1 = z;
}
if (l1 == INF) res2 = -INF; else res2 = res1 + l1;
}
void pri()
{
freopen("mst.out", "w", stdout);
printf("Cost: %d\nCost: %d\n", res1 == -INF ? -1 : res1, res2 == -INF ? -1 : res2);
fclose(stdout);
}
int main()
{
init();
if (!res2) solve();
pri();
return 0;
}
錛?錛塊ruskal錛?/span>
Kruskal綆楁硶涔熷彲浠ョ敤鏉ユ眰嬈″皬鐢熸垚鏍?wèi)銆傚湪鍑嗗鍔犲叆涓鏉℃柊杈?a, b)錛堣杈瑰姞鍏ュ悗涓嶄細(xì)鍑虹幇鐜級(jí)鏃訛紝閫夋嫨鍘熸潵a鎵鍦ㄨ繛閫氬潡錛堣涓篠1錛変笌b鎵鍦ㄨ繛閫氬潡錛堣涓篠2錛?/span>涓紝鐐圭殑涓暟灝戠殑閭d釜錛堝鏋滈殢渚塊変竴涓紝鏈鍧忔儏鍐典笅鍙兘姣忔閮界鍒扮偣鏁板鐨勯偅涓紝鏃墮棿澶嶆潅搴﹀彲鑳藉鑷砄(NM)錛夛紝鎵懼埌璇ヨ繛閫氬潡涓殑姣忎釜鐐筰錛屽茍閬嶅巻鎵鏈変笌i鐩稿叧鑱旂殑杈癸紝鑻ュ彂鐜版煇鏉¤竟鐨勫彟涓绔偣j鍦ㄦ湭閫夋嫨鐨勯偅涓繛閫氬潡涓紙涔熷氨鏄杈?i, j)璺ㄨ秺浜?jiǎn)S1鍜孲2錛夋椂錛屽氨璇存槑鏈緇堝湪T涓?鍒犻櫎杈?a, b)騫跺姞鍏ヨ杈?涓瀹氭槸涓涓彲琛屽彉鎹紝涓旂敱浜庡姞杈規(guī)槸鎸夌収鏉冨奸掑欏哄簭鐨勶紝(a, b)涔熶竴瀹氭槸T涓粠i鍒癹璺緞涓婃潈鍊兼渶澶х殑杈癸紝鏁呰繖涓彲琛屽彉鎹㈠彲鑳芥垚涓轟唬浠鋒渶灝忕殑鍙鍙樻崲錛岃綆楀叾浠d環(huán)涓篬(i, j)杈規(guī)潈鍊?- (a, b)杈規(guī)潈鍊糫錛屽彇鏈灝忎唬浠峰嵆鍙傛敞鎰忥紝鍦ㄩ亶鍘嗘椂闇瑕佹帓闄や竴鏉¤竟錛屽氨鏄?a, b)鏈韓錛堝叿浣撳疄鐜版椂鐢變簬鐢―L杈硅〃錛屽彲浠ュ皢杈?a, b)鐨勭紪鍙蜂唬鍏ワ級(jí)銆傚彟澶栬繕鏈変竴涓毦鎼炵殑鍦版柟錛氬浣曞揩閫熸壘鍑烘煇榪為氬潡鍐呯殑鎵鏈夌偣錛熸柟娉曪細(xì)鐢變簬浣跨敤騫舵煡闆嗭紝榪為氬潡鏄敤鏍?wèi)鐨勬柟寮忓瓨鍌ㄧ殑锛屽彲浠ョ洿鎺ュ晦Z竴媯墊爲(wèi)錛堝噯紜潵璇存槸涓涓.鏋楋級(jí)錛岀敤“鏈宸﹀瓙緇撶偣+鐩擱偦緇撶偣”琛ㄧず錛屽垯鎵懼嚭鏍?wèi)鏍瑰悗閬嶅巻杩檵倝|爲(wèi)灝辮浜?jiǎn)锛屽彟澶栨敞鎰忓湪鍚堯q惰繛閫氬潡鏃朵篃瑕佸悓鏃跺悎騫舵爲(wèi)銆?br />瀵逛簬涓夌鐗規(guī)畩鎯呭喌錛氥?銆戝浘G涓嶈繛閫氥傚垽瀹氭柟娉曪細(xì)閬嶅巻瀹屾墍鏈夌殑杈瑰悗錛屽疄闄呭姞鍏鐨勮竟鏁板皬浜?N-1)錛涖?銆戝浘G鏈韓灝辨槸涓媯墊爲(wèi)銆傚垽瀹氭柟娉曪細(xì)鎵句笉鍒拌繖鏍風(fēng)殑杈?i, j)錛涖?銆戝浘G瀛樺湪騫寵杈廣傝繖涓浜嶬ruskal鏉ヨ瀹屽叏鍙互鏃犺錛屽洜涓篕ruskal涓袱鏉¤竟鍙緙栧彿涓嶅悓灝辮涓轟笉鍚岀殑杈廣?br />鍏跺疄Kruskal綆楁硶姹傛灝忕敓鎴愭爲(wèi)榪樻湁涓涓紭鍖栵細(xì)姣忔鎵懼埌杈?i, j)鍚庯紝涓澶勭悊瀹岃繖鏉¤竟灝辨妸瀹冧粠鍥句腑鍒犳帀錛屽洜涓哄綋S1鍜孲2鍚堝茍鍚庯紝(i, j)灝辨案榪滀笉鍙兘鍐嶆槸鍙鍙樻崲涓殑E2浜?jiǎn)銆?br />
浠g爜錛?br />
#include <stdlib.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 MAXN = 7000, MAXM = 130000, INF = ~0U >> 2;
struct edge {
int a, b, len, pre, next;
} ed[MAXM + MAXM];
struct edge2 {
int a, b, len, No;
} ed2[MAXM];
int n, m = 0, m2, u[MAXN], ch[MAXN], nx[MAXN], q[MAXN], res1 = 0, res2 = INF;
void init_d()
{
re(i, n) ed[i].a = ed[i].pre = ed[i].next = i;
if (n % 2) m = n + 1; else m = n;
}
void add_edge(int a, int b, int l)
{
ed[m].a = a; ed[m].b = b; ed[m].len = l; ed[m].pre = ed[a].pre; ed[m].next = a; ed[a].pre = m; ed[ed[m].pre].next = m++;
ed[m].a = b; ed[m].b = a; ed[m].len = l; ed[m].pre = ed[b].pre; ed[m].next = b; ed[b].pre = m; ed[ed[m].pre].next = m++;
}
void del_edge(int No)
{
ed[ed[No].pre].next = ed[No].next; ed[ed[No].next].pre = ed[No].pre;
ed[ed[No ^ 1].pre].next = ed[No ^ 1].next; ed[ed[No ^ 1].next].pre = ed[No ^ 1].pre;
}
void init()
{
freopen("mst.in", "r", stdin);
scanf("%d%d", &n, &m2);
if (!m2) {
if (n > 1) res1 = -INF;
res2 = -INF; return;
}
init_d();
int a, b, len;
re(i, m2) {
scanf("%d%d%d", &a, &b, &len);
ed2[i].No = m; add_edge(--a, --b, len);
ed2[i].a = a; ed2[i].b = b; ed2[i].len = len;
}
fclose(stdin);
}
int cmp(const void *s1, const void *s2)
{
return ((edge2 *)s1)->len - ((edge2 *)s2)->len;
}
void prepare()
{
re(i, n) u[i] = ch[i] = nx[i] = -1;
qsort(ed2, m2, 16, cmp);
}
int find(int x)
{
int r = x, r0 = x, tmp;
while (u[r] >= 0) r = u[r];
while (u[r0] >= 0) {tmp = u[r0]; u[r0] = r; r0 = tmp;}
return r;
}
void uni(int r1, int r2, int No, int l0)
{
q[0] = r1;
int j, k, l1, front, rear;
for (front=0, rear=0; front<=rear; front++) {
j = ch[q[front]];
while (j != -1) {
q[++rear] = j;
j = nx[j];
}
}
re3(i, 0, rear) {
j = q[i];
for (int p=ed[j].next; p != j; p=ed[p].next) {
k = ed[p].b;
if (p != No && find(k) == r2) {
l1 = ed[p].len - l0;
if (l1 < res2) res2 = l1;
del_edge(p);
}
}
}
u[r2] += u[r1]; u[r1] = r2; nx[r1] = ch[r2]; ch[r2] = r1;
}
void solve()
{
int r1, r2, l0, num = 0;
re(i, m2) {
r1 = find(ed2[i].a); r2 = find(ed2[i].b);
if (r1 != r2) {
l0 = ed2[i].len; res1 += l0; num++;
if (u[r1] >= u[r2]) uni(r1, r2, ed2[i].No, l0); else uni(r2, r1, ed2[i].No ^ 1, l0);
}
}
if (num < n - 1) {res1 = res2 = -INF; return;}
if (res2 == INF) res2 = -INF; else res2 += res1;
}
void pri()
{
freopen("mst.out", "w", stdout);
printf("Cost: %d\nCost: %d\n", res1 == -INF ? -1 : res1, res2 == -INF ? -1 : res2);
fclose(stdout);
}
int main()
{
init();
if (!res1 && res2 == INF) {
prepare();
solve();
}
pri();
return 0;
}
涓嬮潰鏄浜庝竴浜涙暟鎹殑嫻嬭瘯緇撴灉錛堟暟鎹鏄庯細(xì)絎?~9涓偣鍜岀15涓偣涓虹瀵嗗浘鎴栦竴鑸浘錛岀10~14涓偣涓虹█鐤忓浘錛?br />
Prim錛?br />
Kruskal錛堝姞鍏ュ垹杈逛紭鍖栵級(jí)錛?br />
Kruskal錛堟湭鍔犲垹杈逛紭鍖栵級(jí)錛?br />
]]>
浠g爜2錛歋AP澶氳礬澧炲箍錛堥掑綊錛夛紱
浠g爜3錛欴inic鍗曡礬澧炲箍錛堥潪閫掑綊錛夛紱
浠g爜4錛欴inic澶氳礬澧炲箍錛堥掑綊錛夛紱
緇撴灉錛?/p>
浠g爜1錛?br>