锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
錛?錛塖uperMemo錛?a title="PKU3580" >PKU3580錛?br />鏈鐨?涓搷浣滀腑錛宎dd銆乺everse銆乮nsert銆乨elete銆乵in閮戒笉闅炬悶錛岃宺evolve鎿嶄綔闇瑕佹秹鍙?qiáng)鍒板尯闂翠氦鎹€?br />鍙互鍙戠幇錛屾墍璋撶殑鏃嬭漿鍏跺疄灝辨槸浜ゆ崲涓や釜鐩擱偦鍖洪棿錛岃繖瀵逛簬鍔熻兘鏋佸己鐨凷play Tree鏉ヨ鏍規(guī)湰涓嶉毦鎼炪?br />璁捐繖涓や釜鐩擱偦鍖洪棿涓篬x, y]涓嶽y+1, z]錛屽亣璁懼畠浠潎闈炵┖錛堜篃灝辨槸x<=y<z錛屽洜涓鴻嫢鍏朵腑鑷沖皯鏈変竴涓尯闂存槸絀哄尯闂達(dá)紝鍒欎氦鎹㈡病鏈夋剰涔夛級錛屽厛鎵懼埌鏍?wèi)涓瓁鐨勫墠瓚婸涓巣鐨勫悗緇錛堣繖閲寈銆亃絳夋寚鐨勯兘鏄搴旂殑緇撶偣錛屼笅鍚岋級錛屽皢P浼稿睍鍒版牴銆佸皢S浼稿睍鍒版牴鐨勫彸瀛愮粨鐐瑰錛屽垯S鐨勫乏瀛愭爲(wèi)灝辮〃紺哄尯闂碵x, z]銆傜劧鍚庯紝璁維鐨勫乏瀛愭爲(wèi)鐨勬牴緇撶偣錛堜篃灝辨槸S鐨勫乏瀛愮粨鐐癸級涓篘錛屽湪榪欐5瀛愭爲(wèi)涓壘鍒扮1灝忕殑緇撶偣P0涓庣(y-x+2)灝忕殑緇撶偣S0錛堣繖闇瑕佹秹鍙?qiáng)鍒版墤汁愭爲(wèi)鍐吔W琄灝忕殑鎿嶄綔錛屽彧瑕佹妸鎵炬暣媯墊爲(wèi)絎琄灝忕殑鎿嶄綔鐨剅oot鏀逛負(fù)N鍗沖彲錛夛紝瀹冧滑鍒嗗埆琛ㄧずx涓?y+1)錛岃繖鏍峰皢P0浼稿睍鍒癗澶勶紝灝哠0浼稿睍鍒癗鐨勫彸瀛愮粨鐐瑰錛屾樉鐒禤0鏃犲乏瀛愭爲(wèi)錛孲0鐨勫乏瀛愭爲(wèi)T1琛ㄧず鍖洪棿[x+1, y]錛孲0鐨勫彸瀛愭爲(wèi)T2琛ㄧず鍖洪棿[y+2, z]銆傜劧鍚庯紝鍏堝皢S0浠嶱0鐨勫彸瀛愮粨鐐圭Щ鍔ㄥ埌P0鐨勫乏瀛愮粨鐐癸紝鍐嶅皢T1浣滀負(fù)P0鐨勫彸瀛愭爲(wèi)錛堟敞鎰忕Щ鍔ㄦ槸涓ゆ錛氭彃鍏ュ拰鍒犻櫎錛夈傝繖鏍鋒暣媯靛瓙鏍?wèi)鐨勪腑搴忛亶鍘喚l撴灉鍙樻垚浜哠0->T2->P0->T1錛屼篃灝辨槸[y+1, z]∪[x, y]銆?br />鍙﹀鏈鐨勬爣璁版湁鐐歸毦鎼烇紝鍙渶娉ㄦ剰rev鏄嗗悜鏍囪錛屼互鍙?qiáng)鏌ユ壘涓巇m鍏卞瓨灝辮浜嗐?br />浠g爜
錛?錛塒lay with Chain(HDU3487)
榪欎釜綾蟲湁紲為┈濂借鐨勶紝閲岄潰鐨勬搷浣滃湪SuperMemo閲岄兘鏈夛紱
浠g爜
錛?錛?a title="AHOI2006 鏂囨湰緙栬緫鍣?editor)" >AHOI2006 鏂囨湰緙栬緫鍣?editor)
榪欓鍦ㄨ繖涓綾婚閲岄潰綆楁按鐨勩傚浜庡厜鏍囷紝鍙鐢ㄤ竴涓兼潵緇存姢灝辮浜嗐?br />鍙﹀娉ㄦ剰鏈鏋佷負(fù)鐚ョ悙鐨?鐐癸紙棰樼洰涓背鏈夎鏄庯級錛氫竴鏄渶鍒濈殑鏂囨湰騫朵笉鏄┖鐨勶紝鑰屾槸鏈変竴涓┖鏍鹼紱浜屾槸鎵цGET鎿嶄綔鏃跺厜鏍囧彲鑳戒綅浜庢枃鏈湯灝撅紝姝ゆ椂搴旇緭鍑虹┖鏍鹼紱
浠g爜
錛?錛塇FTSC2011 楂樼簿搴﹁綆楀櫒(apc)錛岄鐩榪欎釜甯栧瓙錛?br />榪欓鍙嶆槧鍑轟簡涓涓緢鍥х殑闂錛氭湁浜涗俊鎭細(xì)琚玶ev鏁翠綋鐮村潖銆?br />鏈涓殑鎿嶄綔閮芥槸甯歌鎿嶄綔錛屼絾鏄湰棰樻墍闇瑕佺淮鎶ょ殑淇℃伅鍗翠笉鏄偅涔堝鏄撶淮鎶ゃ傛湰棰樿姹傜淮鎶や竴媯靛瓙鏍?wèi)涓墍鏈夌粨鐐規(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鎿嶄綔錛屽畠浼?xì)鏁翠綋鏀瑰彉鏍?wèi)涓墍鏈夌粨鐐規(guī)墍璁板綍鐨刴od鍊鹼紝榪欐椂錛屽鏋滃啀鐢ㄤ笂闈㈣繖涓紡瀛愭潵緇存姢T[x].mod錛屽氨浼?xì)鍑洪敊锛屽洜湄?fù)姝ゆ椂寮曠敤鍒扮殑T[T[x].c[0]].mod鍜孴[T[x].c[1]].mod閮芥槸榪囨椂鐨勩傝В鍐寵繖涓闂鍙湁涓縐嶆柟娉曪細(xì)璁板綍“閫唌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榪欐牱浼?xì)琚弽铦{鎿嶄綔鏁翠綋鐮村潖鐨勪俊鎭繕鏈夊緢澶氾紝姣斿NOI2005 sequence閲岄潰鐨刲max鍜宺max銆傚鏋滅湡鐨勯亣鍒拌繖綾諱俊鎭紝鍙湁閲囩敤涓婇潰鐨勬柟娉曘?br />鍙﹀錛屾湰棰樼6銆?銆?0涓偣鏈夎銆?br />浠g爜
鐜板湪Splay Tree宸笉澶氬紕瀹屼簡錛屾帴涓嬫潵榪樻湁N澶氱煡鍚嶇殑銆佷笉鐭ュ悕鐨勯珮綰ф暟鎹粨鏋?#8230;…鏃墮棿MS鏈変簺涓嶅鐢ㄤ簡鍥?#8230;…
]]>
璇︾粏璇佹槑錛堣漿緗戜笂鏌愮鐘囩殑錛夛細(xì)
鈥斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺?span style="COLOR: #ffffff">鏈澶ф潈涓嶅彲鑳芥槸璐熸暟錛屽綋鏄?鐨勬儏鍐碉紝鑷劧鏄竴涓偣涓嶉夋渶浼橈紝涓嬮潰鎺㈣蹇界暐0鐨勬儏鍐點(diǎn)?br>
1錛氶鍏堟垜鍋囪鏈変袱涓棴鍚堝瓙鍥鵑兘鎷ユ湁鐩稿悓鐨勬渶澶ф潈錛屽茍涓旀病鏈夊叡鍚岀偣錛?span style="COLOR: red">寰堝鏄撹瘉鏄庝笉浼?xì)鍑虹幇杩櫩U嶆儏鍐碉紝鍥犱負(fù)濡傛灉鎴戜滑鎶婁袱涓棴鍚堝瓙鍥鵑兘閫夋嫨涓婏紝閭d箞鏈澶ф潈浼?xì)鍙樺ぇ銆?/span>
2錛氫粛鐒跺亣璁炬湁涓や釜闂悎瀛愬浘閮芥嫢鏈夌浉鍚岀殑鏈澶ф潈錛屼絾鏄湁鍏卞悓鐐癸紝鍗抽噸鍙犵殑鎰忔濄傛牴鎹棴鍚堝浘鐨勭壒鐐癸紝榪欎簺鍏卞悓鐐逛笉鏄殢鎰忕殑錛屽彲浠ョ煡閬擄紝鍙鏈変竴涓偣鐩稿悓錛岄偅涔堣繖涓偣鐨勮兘鍒拌揪鐨勬墍鏈夊悗緇偣閮藉繀瀹氭槸鍏卞悓鐐廣傛墍浠ヤ細(xì)寰楀嚭涓涓粨璁猴紝涓や釜闂悎瀛愬浘閲嶅彔錛岄噸鍙犵殑閮ㄥ垎蹇呯劧鏄?涓垨鑰呭涓笉閲嶅彔闂悎鍥俱?br>
鐒跺悗鎴戜滑鑰冭檻涓嶉噸鍙犵殑閮ㄥ垎錛岃繖閮ㄥ垎鐨勭偣鏉冨拰鍙互璇佹槑涓瀹氭槸闈炶礋銆傛垜浠彲浠ュ亣璁鵑潪閲嶅彔閮ㄥ垎鐨勭偣鏉冨拰鏄礋鏁幫紝閭d箞鍋囧鎴戜滑鍒犳帀榪欓儴鍒嗭紝鍙夊彇閲嶅彔閮ㄥ垎錛堝洜涓洪噸鍙犻儴鍒嗚偗瀹氭槸闂悎鍥撅級錛岄偅涔堟渶澶ф潈涔熶細(xì)鍙樺ぇ錛岀煕鐩俱傛墍浠?span style="COLOR: red">闈為噸鍙犻儴鍒嗙偣鏉冨拰涓瀹氭槸闈炶礋鏁般?br> 涓嬮潰緇х畫鎺㈣闈為噸鍙犻儴鍒嗙殑鎬ц川銆備笂闈㈢殑璇佹槑宸茬粡寰楀嚭浠栦滑鐨勭偣鏉冨拰涓瀹氭槸闈炶礋銆備笅闈㈠厛鎶涘紑鐐規(guī)潈鍜岀瓑浜?鐨勬儏鍐碉紝鍏堣璁烘鏁扮殑鎯呭喌銆?br>鍋囪涓や釜闂悎瀛愬浘鐨勯潪閲嶅彔閮ㄥ垎閮芥槸姝f暟錛岄偅涔堟妸榪欎袱涓儴鍒嗗姞璧鋒潵閲嶆柊鏋勬垚闂悎鍥撅紝鏈澶ф潈蹇呯劧浼?xì)鍙樺ぇ锛屼笌鍋囪畡勪袱涓悓湄?fù)鏈澶ф潈鐨勯棴鍚堝浘鐭涚浘銆傚浐鍙互璇佹槑闈為噸鍙犻儴鍒嗙殑鐐規(guī)潈鍜岃偗瀹氭槸0銆?br>
鎺㈣鍒拌繖閮ㄥ垎錛屾垜浠凡緇忓彲浠ュ垵姝ュ緱鍑轟竴涓粨璁猴紝灝辨槸涓涓渶澶ф潈闂悎瀛愬浘鐨勭偣鏁板灝戦棶棰樺彧鑳藉彈鍒頒竴浜?鏉冨拰瀛愬浘錛堟墍鏈夌偣鏉冨姞璧鋒潵絳変簬0鐨勫瓙鍥撅級鐨勫共鎵般?br>
閲嶇偣鏉ュ埌榪欎簺0鏉冨拰瀛愬浘涓娿備笅闈㈡垜浠張鏉ュ仛涓涓亣璁撅紝灝辨槸鍋囪鎴戜滑姹傚嚭浜嗕竴涓渶澶ф潈闂悎瀛愬浘錛屽茍涓旈噷闈㈡湁鍖呭惈鍒頒竴浜?鏉冨拰瀛愬浘銆傝屾垜浠繖鏃跺欓渶瑕佸仛鐨勫氨鏄壘鍒伴偅浜涘彲浠ュ垹鍘葷殑0鏉冨拰瀛愬浘錛屽綋鎴戜滑鍒犲幓浜嗘墍鏈夌殑榪欎簺瀛愬浘錛岄偅涔堢偣鏁板氨鍙互杈懼埌鏈灝忋?br>
鍏抽敭鏉ヤ簡銆傚埌搴曞摢浜?鏉冨拰瀛愬浘鏄彲浠ュ垹鍘葷殑錛屽摢浜?鏉冨拰瀛愬浘鏄笉鍙互鍒犲幓鐨勫憿錛?br>
鏍規(guī)嵁闂悎鍥劇殑鎬ц川錛屾垜浠鍒犻櫎涓涓偣錛岄偅涔堝繀欏繪妸鎵鏈夎兘鍒拌揪榪欎釜鐐圭殑鐐瑰垹鍘匯傞偅涔堝緢娓呮櫚鐨勭湅鍒拌鍒犻櫎涓涓瓙鍥撅紝蹇呴』淇濊瘉鍦ㄨ繖涓瓙鍥懼娌℃湁浠諱綍涓涓偣鎸囧悜榪欎釜瀛愬浘銆備篃灝辨槸璇?span style="COLOR: red">榪欎釜瀛愬浘鏄皝闂殑錛屽彧鏈夊嚭杈癸紝娌℃湁鍏ヨ竟銆?br>
鏈鍚庝竴姝ワ紝鍋囧鎴戜滑鑳借瘉鏄庡湪姹傝В鏈澶ф潈闂悎鍥劇殑榪囩▼涓繚璇佷笉浼?xì)閫変笂榪欎簺0鏉冨拰瀛愬浘錛岄偅涔堣繖涓瘉鏄庡氨鍙互緇撴潫浜嗐?br>閫氳繃鏈澶ф祦姹傝В鏈澶ф潈闂悎瀛愬浘錛屾垜浠妸姝g偣鏉冨拰婧愮偣寤鴻竟錛岃竟鏉冧負(fù)鐐規(guī)潈鍊鹼紝璐熺偣鏉冨拰姹囩偣寤鴻竟錛岃竟鏉冧負(fù)鐐規(guī)潈緇濆鍊箋備粩緇嗗垎鏋愭眰瑙f渶澶ф祦鐨勮繃紼嬶紝浼?xì)鍙戠庮C竴浜涗笢瑗褲?br>
鐢變簬閭d簺鍙夊彲涓嶉夌殑0鏉冨拰瀛愬浘鏄皝闂殑錛屾病鏈夊叆杈圭殑錛岄偅涔堝湪姹傝В鏈澶ф祦鐨勮繃紼嬩腑錛屼笉鍙兘鏈夊閮ㄦ祦琛ュ厖錛屾墍浠?span style="COLOR: red">榪欎簺0鏉冨拰瀛愬浘鐨勬瘡涓偣涓庢簮鎴栬呮眹鐨勮竟閮芥槸婊℃祦鐨勩?br>
鏈鍚庢眰鏈澶ф潈闂悎瀛愬浘鐨勭偣錛屾柟娉曟槸浠庢簮鐐瑰紑濮嬮氳繃闈炴弧嫻佽竟鎼滅儲涓涓仈閫氬浘錛屽浘鍐呯殑鐐癸紙闄や簡婧愮偣錛夊氨鏄眰鍑烘潵鐨勬渶澶ф潈闂悎瀛愬浘鐨勭偣銆傝屼笂闈㈣瘉鏄庡埌0鏉冨拰瀛愬浘鐨勭偣鍜屾簮姹囬兘鏄弧嫻侊紝騫朵笖娌℃湁鍏ヨ竟錛屽嚭杈逛篃娌℃湁嫻侊紝閭d箞鑲畾鏃犳硶浠庢簮鐐規(guī)悳绱㈠埌銆傞偅涔堝湪姹傝В鐨勮繃紼嬩腑榪欎簺0鏉冨拰瀛愬浘鐨勭偣鏄偗瀹氭病鏈夐変笂鐨勩?br>
灝辨璇佹瘯銆?br> 緇撹錛?span style="COLOR: red">閫氳繃鏈澶ф祦姹傝В鏈澶ф潈闂悎瀛愬浘鐨勯棶棰橈紝姹傚嚭鏉ョ殑闂悎瀛愬浘鐐規(guī)暟涔熸槸鏈灝戠殑銆?br>
鈥斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺?br>浠g爜錛?br>
#include <stdio.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++)
const int MAXN = 10002, MAXM = 120000, INF = ~0U >> 2;
struct edge {
int a, b, f, next;
edge () {}
edge (int _a, int _b, int _f) : a(_a), b(_b), f(_f), next(-1) {}
} ed[MAXM + MAXM];
int n, m = 0, s, t, hd[MAXN], tl[MAXN], st[MAXN], lev[MAXN], pr[MAXN], hs[MAXN], q[MAXN], now, res = 0, res_num = 0;
bool vst[MAXN];
void add_edge(int a, int b, int f)
{
ed[m] = edge(a, b, f);
if (hd[a] != -1) tl[a] = ed[tl[a]].next = m++; else hd[a] = tl[a] = m++;
ed[m] = edge(b, a, 0);
if (hd[b] != -1) tl[b] = ed[tl[b]].next = m++; else hd[b] = tl[b] = m++;
}
void init()
{
freopen("profit.in", "r", stdin);
int n0, m0, a0, b0, x;
scanf("%d%d", &n0, &m0);
n = n0 + 2; s = 0; t = n - 1;
memset(hd, -1, n << 2); memset(tl, -1, n << 2);
re1(i, n0) {
cin >> x;
if (x > 0) {add_edge(s, i, x); res += x;}
if (x < 0) add_edge(i, t, -x);
}
re1(i, m0) {
scanf("%d%d", &a0, &b0);
add_edge(a0, b0, INF);
}
fclose(stdin);
}
void aug()
{
int z = hs[t], i = t, p;
while (i != s) {
hs[i] -= z; p = pr[i]; ed[p].f -= z; ed[p ^ 1].f += z; i = ed[p].a;
if (!ed[p].f) now = i;
}
res -= z;
}
bool dfs()
{
q[0] = s; memset(vst, 0, n); vst[s] = 1; lev[s] = 0;
int i, j, f0;
for (int front=0, rear=0; front<=rear; front++) {
i = q[front];
for (int p=hd[i]; p != -1; p=ed[p].next) {
j = ed[p].b; f0 = ed[p].f;
if (!vst[j] && f0) {vst[j] = 1; lev[j] = lev[i] + 1; q[++rear] = j;}
}
}
if (!vst[t]) return 0;
now = s; memset(vst, 0, n); hs[s] = INF;
re(i, n) st[i] = hd[i];
bool ff;
while (!vst[s]) {
if (now == t) aug();
ff = 0;
for (int p=st[now]; p != -1; p=ed[p].next) {
j = ed[p].b; f0 = ed[p].f;
if (lev[now] + 1 == lev[j] && !vst[j] && f0) {st[now] = pr[j] = p; hs[j] = hs[now] <= f0 ? hs[now] : f0; now = j; ff = 1; break;}
}
if (!ff) {
vst[now] = 1;
if (now != s) now = ed[pr[now]].a;
}
}
return 1;
}
void solve()
{
while (dfs()) ;
q[0] = s; memset(vst, 0, n); vst[s] = 1;
int i, j, f0;
for (int front=0, rear=0; front<=rear; front++) {
i = q[front];
for (int p=hd[i]; p != -1; p=ed[p].next) {
j = ed[p].b; f0 = ed[p].f;
if (!vst[j] && f0) {vst[j] = 1; res_num++; q[++rear] = j;}
}
}
}
void pri()
{
freopen("profit.out", "w", stdout);
printf("%d\n%d\n", res, res_num);
fclose(stdout);
}
int main()
{
init();
solve();
pri();
return 0;
}
]]>