锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
鏈矙鑼跺幓騫存浘緇忕敤鍙岀嚎孌墊爲鐨勬柟娉曟崏浜嗚繖棰橈紙璇﹁榪欓噷錛夛紝鏈榪戦噸鏂板瑙嗚繖棰樺彂鐜幫紝鍊熷姪騫寵 鏍戯紝鍙互寰楀埌鏇寸畝鍗曠殑鏂規硶銆?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鎿嶄綔錛屽彧闇瑕佸叏閮ㄤ綅緗敼涓嶅崰鐢ㄥ嵆鍙紙涓嶈兘閲嶆柊寤烘爲錛侊紒錛夛紱
榪欐牱錛屽埄鐢ㄤ竴媯靛鉤琛℃爲鍔犱竴媯電嚎孌墊爲錛屽氨鍙互寰楀埌涓涓緢綆鍗曠殑鏂規硶浜嗭紙浠g爜閲忔槸鍙屽鉤琛℃爲鎴栧弻綰挎鏍戠殑涓鍗婂乏鍙籌級錛?br />
榪欓鐨勫惎紺烘槸錛屽湪瑙e喅鏁版嵁緇撴瀯緇熻綾婚鐨勬椂鍊欙紝鍒板簳閫夌敤浠涔堟牱鐨勬暟鎹粨鏋勶紝鏄湁璁茬┒鐨勶紝鍥犱負瀹冨皢鐩存帴褰卞搷鍒扮紪紼嬪鏉傚害銆備竴鑸潵璇達紝綰挎鏍戞瘮騫寵 鏍戝ソ鍐欙紝浣嗘槸瀵規湰棰樿岃█錛屽弻綰挎鏍戝弽鑰屼笉濡傚鉤琛℃爲鍔犵嚎孌墊爲濂藉啓錛岃繖鏄洜涓哄浜庡唴瀛樺潡浣跨敤騫寵 鏍戠淮鎶ゆ瘮浣跨敤綰挎鏍戠淮鎶ゆ洿濂姐傚湪浠ュ悗鍋氳繖縐嶉鐨勬椂鍊欙紝瑕佸鎯充竴涓嬶紝鎵懼埌綆渚挎柟娉曘?br />
]]>
2012騫?鏈?0鏃ワ紝寮濮嬪啓鍔ㄦ佹爲錛屼嬌鐢ㄧ殑棰樻槸QTREE錛岃姳浜嗘暣鏁翠竴澶╂椂闂存葷畻鍐欏畬錛屼氦涓婂幓錛孴LE……
2012騫?鏈?1鏃ワ紝鍙堣皟浜嗕竴澶╋紝瀵規媿浜?00+緇勯殢鏈烘暟鎹兘鐬棿鍑鴻В錛屼氦涓婂幓錛岃繕鏄疶LE……
2012騫?鏈?鏃ワ紝WC2012錛宖anhq666璁插姩鎬佹爲錛屽張鎼炴噦浜嗕竴鐐癸紝浜庢槸褰撳ぉ鏅氫笂鍥炴埧闂翠互鍚庡氨寮濮嬬戶緇皟錛屼氦涓婂幓錛孴LE……
2012騫?鏈?鏃ワ紝鏅氫笂緇х畫璋僎TREE錛孴LE……
鍦ㄦ寫鎴樺姩鎬佹爲N嬈″け璐ヤ箣鍚庯紝鏈矙鑼舵槰澶╁啀嬈″幓鎸戞垬鍔ㄦ佹爲……榪欐鎹簡涓涓錛?a title="BZOJ2002" >BZOJ2002錛堜紶璇翠腑鐨勫姩鎬佹爲妯℃澘棰橈級
涓寮濮嬭繕鏄疶LE浜嗭紝涓嶈繃鍚庢潵鎶婃暟鎹悶鍒版墜浠ュ悗錛屽彂鐜癟LE鐨勫師鍥犲茍涓嶆槸甯告暟澶э紝鑰屾槸姝誨驚鐜簡錛屾渶鍚庯紝緇忚繃2h+鐨勮皟璇曪紝鎬葷畻鎵懼埌浜嗛敊璇紙鏈夊ソ鍑犲錛夛紝緇堜簬AC浜?#8230;…
銆愬叧浜嶣ZOJ2002銆?br />浠庢瘡涓偣i寰(i+Ki)榪炰竴鏉¤竟錛屽鏋?i+Ki)涓嶅瓨鍦ㄥ垯寰涓涓檮鍔犵殑緇撶偣錛堟湰娌欒尪鐨勪唬鐮佷腑涓?鍙風偣錛屽洜涓?鍙風偣鏄笉鑳戒嬌鐢ㄧ殑錛夎繛涓鏉¤竟錛岃繖鏍峰氨鏄竴媯墊爲錛堥櫎1鍙風偣澶栵紝姣忎釜鐐規湁涓斿彧鏈変竴涓悗緇?#8230;…錛夛紝鐒跺悗錛岄棶棰樹腑鐨勪袱縐嶆搷浣滃氨鏄?#8220;鏀規帴”鍜?#8220;璇㈤棶鍒版牴鐨勮窛紱?#8221;錛屽彲浠ョ敤鍔ㄦ佹爲鎼烇紱
銆愪唬鐮併?br />
#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--)
const int MAXN = 200004, INF = ~0U >> 2;
struct node {
int c[2], p, sz;
bool rf, d;
} T[MAXN];
int n;
void sc(int _p, int _c, bool _d)
{
T[_p].c[_d] = _c; T[_c].p = _p; T[_c].d = _d;
}
void upd(int No)
{
T[No].sz = T[T[No].c[0]].sz + T[T[No].c[1]].sz + 1;
}
void rot(int No)
{
int p = T[No].p; bool d = T[No].d;
if (T[p].rf) {T[p].rf = 0; T[No].rf = 1; T[No].p = T[p].p;} else sc(T[p].p, No, T[p].d);
sc(p, T[No].c[!d], d); sc(No, p, !d); upd(p);
}
void splay(int No)
{
int p; while (!T[No].rf) if (T[p = T[No].p].rf) rot(No); else if (T[No].d == T[p].d) {rot(p); rot(No);} else {rot(No); rot(No);} upd(No);
}
int access(int x)
{
int tmp = 0;
do {
splay(x); T[T[x].c[1]].rf = 1; T[tmp].rf = 0; sc(x, tmp, 1); upd(x); tmp = x; x = T[x].p;
} while (x);
}
void cut(int x)
{
access(x); splay(x); T[T[x].c[0]].rf = 1; T[T[x].c[0]].p = 0; sc(x, 0, 0); upd(x);
}
void join(int x, int p)
{
access(x); T[x].p = p;
}
int main()
{
int m, x, y, z;
scanf("%d", &n); n++;
re3(i, 2, n) {scanf("%d", &x); T[i].sz = 1; T[i].rf = 1; if (i + x <= n) T[i].p = i + x; else T[i].p = 1;}
T[1].sz = 1; T[1].rf = 1; T[0].sz = 0;
scanf("%d", &m);
re(i, m) {
scanf("%d", &x);
if (x == 1) {
scanf("%d", &y); y += 2;
access(y); splay(y); printf("%d\n", T[T[y].c[0]].sz);
} else {
scanf("%d%d", &y, &z); y += 2;
cut(y); if (y + z <= n) join(y, y + z); else join(y, 1);
}
}
return 0;
}
銆愭槗鐤電偣銆?br />錛?錛夋敞鎰忎竴涓偣鐨勭埗緇撶偣p鏈変袱縐嶅彲鑳斤細濡傛灉璇ョ粨鐐規槸鏌愭5浼稿睍鏍戠殑鏍圭粨鐐瑰垯p涓哄畠閫氳繃杞昏竟榪炲悜鐨勫彟涓媯典幾灞曟爲涓殑鏌愪竴涓偣鐨勭紪鍙鳳紙鍦ㄥ師鏍戜腑錛屽氨鏄緇撶偣鎵鍦ㄤ幾灞曟爲浠h〃鐨勯摼鐨勬渶涓婂眰鐨勯偅涓妭鐐圭殑鐖剁粨鐐癸級錛屽惁鍒欎負璇ョ粨鐐瑰湪浼稿睍鏍戜腑鐨勭埗緇撶偣緙栧彿錛堥氳繃閲嶈竟鐩歌繛錛夛紱
錛?錛夊湪鏀規帴鏃跺垹闄よ竟鐨勬椂鍊欙紝濡傛灉鍒犻櫎鐨勬槸杞昏竟鍒欑洿鎺ユ妸鐖剁粨鐐硅涓?鍗沖彲錛屽鏋滄槸閲嶈竟鍒欒sc涓涓嬪啀灝嗙埗緇撶偣璁句負0錛?br />錛?錛塺ot閲岄潰鏈変竴涓湴鏂瑰緢鍏抽敭錛屾瀬鏄撶柕錛佸氨鏄鏋減鏄幾灞曟爲鐨勬牴緇撶偣錛屽垯闄や簡No鐨剅f鏀逛負1錛宲鐨剅f鏀逛負0涔嬪錛岃繕瑕佹妸No鐨勭埗緇撶偣璁句負p鐨勭埗緇撶偣錛?br />錛?錛夋湰棰樹腑涓嶆秹鍙婃暣媯靛ぇ鏍戠殑鏍癸紙灝辨槸root錛夛紝濡傛灉闇瑕乺oot錛屽垯rot涓繕瑕佸姞涓鍙ワ細if (root == p) root = No;
錛?錛塩ut閲岄潰鏈変竴縐嶇畝渚垮啓娉曪紙涓嶉渶瑕佹壘鍒皒鐨勭埗緇撶偣鐨勶級錛氬厛access(x)錛屽皢x浼稿睍鍒版牴涔嬪悗錛寈鍙婂叾鍙沖瓙鏍戝氨鏄師鏍戜腑浠涓烘牴鐨勫瓙鏍戯紝宸﹀瓙鏍戝氨鏄叾瀹冮儴鍒嗭紝鎵浠ョ洿鎺ュ皢x涓庡叾宸﹀瓙緇撶偣鏂紑鍗沖彲錛堟敞鎰忔柇寮鐨勬槸閲嶈竟鎵浠ヨsc涓涓嬶紝鍐嶅皢x鐨勫乏瀛愮粨鐐圭殑鐖剁粨鐐硅涓?銆乺f璁句負1錛屽啀upd涓涓嬶級錛?br />錛?錛変竴瀹氳鎼炴竻妤歳f鐨勫彉鍖栵紙璇ユ敼鏃朵竴瀹氳鏀癸紒錛?br />
鏈鍚庯紝鏀句笂fanhq666瓚呯駭澶х鐨勬葷粨錛?br />01
]]>
錛?錛夎嫢UP[a0]==UP[b0]錛屽垯a0銆乥0浣嶄簬鍚屼竴鏉¢噸閾句笂錛屾樉鐒禷0銆乥0涓繁搴﹀皬鐨勯偅涓氨鏄疞CA浜嗭紝榪斿洖緇撴灉錛岀粨鏉燂紱
錛?錛夎嫢UP[a0]!=UP[b0]涓擠EP[UP[a0]]>=DEP[UP[b0]]錛屽垯LCA涓嶅彲鑳藉湪a0鎵鍦ㄧ殑閭f潯閲嶉摼涓?/strong>銆傝瘉鏄庯細鑻CA鍦╝0鎵鍦ㄧ殑閲嶉摼涓婏紝鍒橴P[a0]蹇呯劧涔熸槸a0銆乥0鐨勫叕鍏辯鍏堬紝涔熷氨鏄疷P[a0]鏄痓0鐨勭鍏堛傜敱浜嶶P[a0]鐨勬繁搴﹀ぇ浜庣瓑浜嶶P[b0]錛岃嫢DEP[UP[a0]]>DEP[b0]錛屽垯UP[a0]鏄劇劧涓嶅彲鑳芥槸b0鐨勭鍏堬紝鍚﹀垯錛屽湪b0鎵鍦ㄧ殑閲嶉摼涓婂繀鐒跺瓨鍦ㄤ竴涓偣C錛屾弧瓚矰EP[C]=DEP[UP[a0]]錛屾樉鐒訛紝C涔熸槸b0鐨勭鍏堬紝榪欏氨璇存槑鍦ㄦ爲涓悓涓娣卞害澶勫瓨鍦ㄤ袱涓笉鍚岀殑緇撶偣錛屽畠浠兘鏄痓0鐨勭鍏堬紝榪欐槸涓嶅彲鑳界殑錛屾墍浠ワ紝LCA涓嶅彲鑳藉湪a0鎵鍦ㄩ噸閾句笂銆傞偅涔堬紝a0灝卞彲浠ヤ笂婧埌UP[a0]鐨勭埗緇撶偣澶勶紙涔熷氨鏄疎[FA[UP[a0]]].a錛夛紝b0涓嶅姩錛岀劧鍚庣戶緇垽鏂紱
錛?錛夎嫢UP[a0]!=UP[b0]涓擠EP[UP[a0]]<DEP[UP[b0]]錛屽垯LCA涓嶅彲鑳藉湪b0鎵鍦ㄧ殑閲嶉摼涓婏紝灝哹0涓婃函鍒癊[FA[UP[b0]]].a錛宎0涓嶅姩錛岀戶緇垽鏂?br />鐢變簬a0銆乥0鏈澶氫笂婧疧(log2N)嬈★紝鎵浠ヨ綆楁硶涓瀹氳兘鍦∣(log2N)鏃墮棿鍐呮眰鍑篖CA(a0, b0)銆?br />璇ョ畻娉曠殑搴旂敤寰堝箍錛屼笉鍏夊彲浠ュ湪鏍戠殑璺緞鍓栧垎涓揩閫熸眰鍑篖CA錛岀簿綆浠g爜錛屽悓鏃朵篃鍑忓皯浜嗕竴浜涙椂闂達紙鍥犱負瀹冧笉闇瑕佸儚RMQ閭f牱榪涜棰勫鐞嗭級錛岃屼笖錛屽湪涓鑸殑姹侺CA闂涓紝涔熷彲浠ュ厛鍓栧垎姹傚嚭UP鍐嶆眰LCA銆?br />浠g爜錛?
{
while (1) {
if (UP[a] == UP[b]) return DEP[a] <= DEP[b] ? a : b;
else if (DEP[UP[a]] >= DEP[UP[b]]) a = E[FA[UP[a]]].a; else b = E[FA[UP[b]]].a;
}
}
銆?銆戞爲鐨勮礬寰勫墫鍒嗘ā鏉挎葷粨錛?br />錛?錛夐澶勭悊閮ㄥ垎錛氱敱浜庨噰鐢ㄦ柊鍨婰CA綆楁硶錛堟敞鎰忥紝姹侺CA鐨勮繃紼嬪啓鎴愪笓闂ㄧ殑鍑芥暟錛夛紝鎵浠ワ紝鍘熸潵棰勫鐞嗛儴鍒嗙殑鍚?姝ラ兘涓嶉渶瑕佷簡錛屼篃灝辨槸鍙鍓?姝ワ細絎竴姝ュ緩鏈夋牴鏍戞眰鍑篎A銆丏EP錛涚浜屾姹傚嚭SZ鍒掑垎杞婚噸杈癸紱絎笁姝ユ壘閲嶉摼寤虹嚎孌墊爲姹傚嚭UP銆乷rd銆乼ot鍜宺oot銆傞偅浜涗負浜嗘眰RMQ鑰岃緗殑鏁扮粍涔熶笉闇瑕佷簡銆?br />錛?錛夋搷浣滈儴鍒嗭細闅劇偣鍦ㄤ簬涓婃函榪囩▼鍜岃鎺ャ傝寰呮搷浣滅殑璺緞涓篴0->b0錛堟敞鎰忔槸鏈夊悜鐨勶紝鏃犲悜鐨勪篃鍙互褰撴垚鏈夊悜鐨勫鐞嗭級錛孡CA0=LCA(a0, b0)錛?/span>
瀵逛簬鐐規潈鍨嬬殑鏍戯紝a0->LCA0鐨勮繃紼嬮渶瑕佸寘鍚?/span>LCA0錛岃?/span>b0->LCA0鐨勮繃紼嬩笉鑳藉寘鍚?/span>LCA0銆傚洜姝ゅ綋b0==LCA0鏃訛紝絎簩姝ュ簲璇ヤ粈涔堜簨閮戒笉鍋氾紝鎵浠ヨ鐗瑰垽錛涙澶栵紝濡傛灉N==1錛堟爲涓彧鏈変竴涓粨鐐癸級錛屼負浜嗛槻姝㈠紩鐢ㄦ牴鐨勭埗緇撶偣錛屼篃闇瑕佺洿鎺ョ壒鍒ゆ帀錛屾墍浠ワ紝涓婃函榪囩▼鍙互鍒嗕互涓?姝ワ細
<1>鐗瑰垽錛氳嫢n=1錛堟鏃跺繀鐒舵湁a0==b0==0錛夛紝鐩存帴鎿嶄綔0鍙風粨鐐癸紝緇撴潫錛?br /><2>(a0->LCA)鑻0鏄埗杈規槸杞昏竟鐨勫彾緇撶偣錛屽垯鍗曠嫭澶勭悊a0錛屾渶鏂扮偣璁句負a0錛宎0璺沖埌a0鐨勭埗緇撶偣澶勫紑濮嬶紝鍚﹀垯浠巃0寮濮嬶紙涓婃函錛夈備笂婧粓姝㈡潯浠朵負DEP[a0]<DEP[LCA0]鎴栬呬笂婧埌鏍圭粨鐐癸紝姣忔澶勭悊鏃訛紝璁綾=”UP[a0]涓嶈秴瓚奓CA?UP[a0]:LCA"錛屽[c, a0]孌靛鐞嗭紙l0=ord[c], r0=ord[a0]錛夛紝鍐嶅皢a0涓婃函鍒癱鐨勭埗緇撶偣澶勶紙鑻鏄牴緇撶偣鍒欓鍑猴級錛涘鐞嗘椂錛岀嚎孌墊爲涓褰曠殑鎵鏈夋湁鍚戠殑錛堜粠宸﹀埌鍙崇殑錛変俊鎭兘瑕佸弽鍚戯紱琛旀帴鏃跺簲涓嶆柇鍚戝彸琛旀帴錛?br /><3>(b0->LCA)涓?lt;2>綾諱技錛屼袱涓笉鍚岀偣錛氫竴鏄湁鍚戠殑淇℃伅涓嶈鍙嶅悜錛岃鎺ユ椂搴斾笉鏂悜宸﹁鎺ワ紱浜屾槸鑻==LCA錛屽垯l0=ord[c]+1錛?br /><4>鏈鍚庡皢<2>涓拰<3>涓緱鍒扮殑涓や釜琛旀帴閾懼啀琛旀帴涓涓嬪嵆鍙紱
瀵逛簬杈規潈鍨嬬殑鏍戯紝a0->LCA0鐨勮繃紼嬪拰b0->LCA0鐨勮繃紼嬮兘瑕佸寘鍚獿CA0寮曞嚭鐨勮竟錛宐0==LCA0浠ュ強N==1鏃朵笉闇瑕佺壒鍒わ紙鍥犱負瀹冧滑浼氳嚜鍔ㄥ湴浠涔堜簨閮戒笉鍋氾級錛涘湪澶勭悊榪囩▼涓紝l0=ord[c], r0=ord[a0]-1錛涜鍒嗚交杈瑰拰閲嶉摼鍒嗗埆澶勭悊錛涙瘡嬈0涓婃函鍒癱鑰屼笉鏄痗鐨勭埗緇撶偣澶勶紱緇堟鏉′歡涓篋EP[a0]<=DEP[LCA0]銆?br />
妯℃澘棰橈細PKU2831錛堝姩鎬佹渶灝忕敓鎴愭爲闂錛岄渶瑕佹秹鍙婂埌鏈灝忕敓鎴愭爲涓袱鐐逛箣闂磋礬寰勪笂鐨勬渶澶ц竟鏉冿紝鐢ㄦ爲鐨勮礬寰勫墫鍒嗐傚叾瀹炴湰棰樻湁紱葷嚎綆楁硶錛屼笉闇瑕佹爲鐨勮礬寰勫墫鍒嗭級
#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--)
const int MAXN = 1001, MAXM = 100001, INF = ~0U >> 2;
struct _edge {
int a, b, w;
} _E[MAXM], _E2[MAXM];
struct edge {
int a, b, w, pre, next;
bool Z;
} E0[MAXN << 2], E[MAXN << 2];
struct node {
int maxw, lch, rch;
} T[MAXN << 2];
int n, _m, m0, m, N, u[MAXN], Q[MAXN], FA[MAXN], DEP[MAXN], SZ[MAXN], UP[MAXN], ord[MAXN], w0[MAXN], tot[MAXN], root[MAXN], l0, r0, x0, res;
bool vst[MAXN];
void init_d()
{
re(i, n) E0[i].pre = E[i].pre = E0[i].next = E[i].next = i;
m0 = m = n;
}
void add_edge0(int a, int b, int w)
{
E0[m0].a = a; E0[m0].b = b; E0[m0].w = w; 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].w = w; 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, int w)
{
E[m].a = a; E[m].b = b; E[m].w = w; E[m].Z = 0; E[m].pre = E[a].pre; E[m].next = a; E[a].pre = m; E[E[m].pre].next = m++;
}
int cmp(const void *s1, const void *s2)
{
return ((_edge *)s1)->w - ((_edge *)s2)->w;
}
int UFS_find(int x)
{
int r = x, tmp; while (u[r] >= 0) r = u[r]; while (u[x] >= 0) {tmp = u[x]; u[x] = r; x = tmp;} return r;
}
void UFS_union(int x1, int x2)
{
if (u[x1] >= u[x2]) {u[x2] += u[x1]; u[x1] = x2;} else {u[x1] += u[x2]; u[x2] = x1;}
}
int mkt(int l, int r)
{
int No = ++N;
if (l == r) {T[No].maxw = w0[l]; T[No].lch = T[No].rch = 0;} else {
int mid = l + r >> 1, l_r = mkt(l, mid), r_r = mkt(mid + 1, r);
T[No].maxw = T[T[No].lch = l_r].maxw >= T[T[No].rch = r_r].maxw ? T[l_r].maxw : T[r_r].maxw;
}
return No;
}
void prepare()
{
qsort(_E2, _m, sizeof(_E2[0]), cmp);
re(i, n) u[i] = -1;
int a, b, r1, r2, total = 0, maxsz, x, n0;
re(i, _m) {
a = _E2[i].a; b = _E2[i].b; r1 = UFS_find(a); r2 = UFS_find(b);
if (r1 != r2) {UFS_union(r1, r2); add_edge0(a, b, _E2[i].w); if (++total == n - 1) break;}
}
re(i, n) vst[i] = 0; Q[0] = DEP[0] = N = 0; vst[0] = 1; FA[0] = -1;
for (int front=0, rear=0; front<=rear; front++) {
a = Q[front];
for (int p=E0[a].next; p != a; p=E0[p].next) {
b = E0[p].b;
if (!vst[b]) {FA[b] = m; DEP[b] = DEP[a] + 1; vst[b] = 1; Q[++rear] = b; add_edge(a, b, E0[p].w);}
}
}
rre(i, n) {
a = Q[i]; SZ[a] = 1; maxsz = 0;
for (int p=E[a].next; p != a; p=E[p].next) {
b = E[p].b; SZ[a] += SZ[b]; if (SZ[b] > maxsz) {maxsz = SZ[b]; x = p;}
}
if (SZ[a] > 1) E[x].Z = 1;
}
UP[0] = ord[0] = 0;
re2(i, 1, n) {
a = Q[i]; int p = FA[a]; if (E[p].Z) {UP[a] = UP[E[p].a]; ord[a] = ord[E[p].a] + 1;} else {UP[a] = a; ord[a] = 0;}
if (SZ[a] == 1 && E[FA[a]].Z) {
b = UP[a]; n0 = ord[a]; for (int j=a; j!=b; j=E[FA[j]].a) w0[--n0] = E[FA[j]].w;
tot[b] = ord[a]; root[b] = mkt(0, ord[a] - 1);
for (int j=a; j!=b; j=E[FA[j]].a) {tot[j] = tot[b]; root[j] = root[b];}
}
}
}
int LCA(int a, int b)
{
while (1) {
if (UP[a] == UP[b]) return DEP[a] <= DEP[b] ? a : b;
else if (DEP[UP[a]] >= DEP[UP[b]]) a = E[FA[UP[a]]].a; else b = E[FA[UP[b]]].a;
}
}
void opr0(int l, int r, int No)
{
if (l >= l0 && r <= r0) {if (T[No].maxw > res) res = T[No].maxw;} else {
int mid = l + r >> 1;
if (mid >= l0) opr0(l, mid, T[No].lch);
if (mid < r0) opr0(mid + 1, r, T[No].rch);
}
}
int main()
{
int P, s, a0, b0, w0, LCA0, c;
scanf("%d%d%d", &n, &_m, &P); init_d();
re(i, _m) {
scanf("%d%d%d", &a0, &b0, &w0);
_E[i].a = _E2[i].a = --a0; _E[i].b = _E2[i].b = --b0; _E[i].w = _E2[i].w = w0;
}
prepare();
re(i, P) {
scanf("%d%d", &s, &w0); a0 = _E[--s].a; b0 = _E[s].b; LCA0 = LCA(a0, b0);
res = -INF;
while (DEP[a0] > DEP[LCA0]) {
if (E[FA[a0]].Z) {
if (DEP[UP[a0]] >= DEP[LCA0]) c = UP[a0]; else c = LCA0;
l0 = ord[c]; r0 = ord[a0] - 1; opr0(0, tot[a0] - 1, root[a0]); a0 = c;
} else {
if (E[FA[a0]].w > res) res = E[FA[a0]].w;
a0 = E[FA[a0]].a;
}
}
while (DEP[b0] > DEP[LCA0]) {
if (E[FA[b0]].Z) {
if (DEP[UP[b0]] >= DEP[LCA0]) c = UP[b0]; else c = LCA0;
l0 = ord[c]; r0 = ord[b0] - 1; opr0(0, tot[b0] - 1, root[b0]); b0 = c;
} else {
if (E[FA[b0]].w > res) res = E[FA[b0]].w;
b0 = E[FA[b0]].a;
}
}
puts(res >= w0 ? "Yes" : "No");
}
return 0;
}
濂戒簡錛屽浜庢ā鏉夸篃灝卞埌姝や負姝簡錛屾帴涓嬫潵璇ユ悶搴旂敤浜嗐?img src ="http://www.shnenglu.com/MatoNo1/aggbug/164163.html" width = "1" height = "1" />
]]>
]]>
]]>
錛?錛塖uperMemo錛?a title="PKU3580" >PKU3580錛?br />鏈鐨?涓搷浣滀腑錛宎dd銆乺everse銆乮nsert銆乨elete銆乵in閮戒笉闅炬悶錛岃宺evolve鎿嶄綔闇瑕佹秹鍙婂埌鍖洪棿浜ゆ崲銆?br />鍙互鍙戠幇錛屾墍璋撶殑鏃嬭漿鍏跺疄灝辨槸浜ゆ崲涓や釜鐩擱偦鍖洪棿錛岃繖瀵逛簬鍔熻兘鏋佸己鐨凷play Tree鏉ヨ鏍規湰涓嶉毦鎼炪?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 />鏈涓殑鎿嶄綔閮芥槸甯歌鎿嶄綔錛屼絾鏄湰棰樻墍闇瑕佺淮鎶ょ殑淇℃伅鍗翠笉鏄偅涔堝鏄撶淮鎶ゃ傛湰棰樿姹傜淮鎶や竴媯靛瓙鏍戜腑鎵鏈夌粨鐐規墍琛ㄧず鐨勫厓绱犲簭鍒楋紙涓簭閬嶅巻緇撴灉錛夋ā涓涓寚瀹氱殑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鎿嶄綔錛屽畠浼氭暣浣撴敼鍙樻爲涓墍鏈夌粨鐐規墍璁板綍鐨刴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;…
]]>
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 />
]]>