題目鏈結
正解:$link-cut \ tree$。
這道題我在考場上從看題到放棄只花了$20$多分鐘。。
爆剛$t2$無果,$12$點的鐘聲響起,我無奈地開始看這道題,然後發現了生的希望。。
只寫了二十幾分鐘,然後又滾回去剛$t2$了。。正解根本就沒去想了(雖然本來也不會。。
不得不說這道題的標算還是很妙的,我就算去想也不可能往$lct$這方面想。。
我們每次新開乙個點,就直接從根結點開始$explore$。
我們可以用$lct$維護當前這棵樹的鏈,於是每次從現在$splay$的根結點開始往下走。
如果$explore$返回的點在左子樹,我們就往左移,在右子樹則往右移,如果不在這棵樹我們就直接跳到$explore$返回的這個點所在的樹。
可以發現,在一棵$splay$上我們最多隻會移動$splay$深度次數,那麼時間複雜度和查詢複雜度也可以保證在$o(n log n)$。
注意一點,就是每次找到目標點以後都要通過$access$來保證複雜度,以及鏈的情況需要特判。
$upd$:這個做法被$hack$了,所以我也不知道正解是什麼。
1//rts sample program
2 #include 3 #include "
rts.h"4
#define il inline
5#define rg register
6#define n (300005)78
using
namespace
std;910
int ch[n][2
],fa[n],l[n],r[n],p[n],vis[n],lst,nxt,n;
1112 dequeq;
13 deque::iterator it;
1415 il void
work()
27 } else
if (lst==v)
34 } else43}
44}45return;46
}4748 il int isroot(rg int
x)51
52 il void pushup(rg int
x)56
57 il void rotate(rg int
x)63
64 il void splay(rg int
x)70
return;71
}7273 il void access(rg int
x)79
return;80
}8182void play(int _n, int t, int
datatype)
87for (rg int i=1;i<=n;++i) l[i]=r[i]=i;
88for (rg int i=2,x,v;i<=n;++i)
100}
101}
102access(x);
103}
104return
;105 }
UOJ 349 WC2018 即時戰略
題目鏈結 一開始已知一號點。每次可以選定乙個已知點和乙個未知點,然後互動庫會返回從已知點出發到達未知點路徑上的第二個點。要求在有限步之內知道每乙個點。次數要求 鏈的情況要求 o n o n o n 其餘是 o n logn o nlogn o nlog n 首先是鏈的情況,記錄當前左右端點不斷往後探...
UOJ 349 WC2018 即時戰略
被cqz d沒了。我d cly 關你啥事 逃 首先鏈的情況直接rand就好了。期望次數 o n log n 然而我一開始寫掛了。開始扯淡 我用這個模數,就可以過原題資料 c l y a k i o i 但是用以下兩種都不行 g l y a k i o i c l y a k i o i n o i ...
UOJ 349 WC2018 即時戰略
傳送門 按照紫荊花之戀的做法,動態維護一下點分樹的形態 把點隨機打亂 每次從當前的根開始 explore 如果已經有了就暴力跳到那個點 否則加入這個點 注意一條鏈的要單獨處理 include include rts.h using namespace std typedef long long ll...