火車司機出秦川,跳蚤國王下江南,共價大爺遊長沙。每個週末,勤勞的共價大爺都會開車遊歷長沙市。
長沙市的交通線路可以抽象成為乙個 \(n\) 個點 \(n−1\) 條邊的無向圖,點編號為 \(1\) 到 \(n\),任意兩點間均存在恰好一條路徑,顯然兩個點之間最多也只會有一條邊相連。有乙個包含一些點對 \((x,y)\) 的可重集合s,共價大爺的旅行路線是這樣確定的:每次他會選擇 \(s\) 中的某一對點 \((x,y)\),並從 \(x\) 出發沿著唯一路徑到達 \(y\) 。
小l是共價大爺的腦殘粉,為了見到共價大爺的尊容,小l決定守在這張圖的某條邊上等待共價大爺的到來。為了保證一定能見到他,顯然小l必須選擇共價大爺一定會經過的邊——也就是所有共價大爺可能選擇的路徑都經過的邊。
現在小l想知道,如果他守在某一條邊,是否一定能見到共價大爺。
然而長沙市總是不斷的施工,也就是說,可能某個時刻某條邊會斷開,同時這個時刻一定也有某條新邊會出現,且任意時刻圖都滿足任意兩點間均存在恰好一條路徑的條件。注意斷開的邊有可能和加入的新邊連線著相同的兩個端點。共價大爺的興趣也會不斷變化,所以s也會不斷加入新點對或者刪除原有的點對。當然,小l也有可能在任何時候向你提出守在某一條邊是否一定能見到共價大爺的問題。你能回答小l的所有問題嗎?
輸入的第一行包含乙個整數 \(id\),表示測試資料編號,如第一組資料的\(id=1\),樣例資料的 \(id\) 可以忽略。hack資料中的 \(id\) 必須為 \(0\) 到 \(10\) 之間的整數。hack資料中 \(id\) 的值和資料型別沒有任何關係。
輸入的第二行包含兩個整數 \(n,m\),分別表示圖中的點數,以及接下來會發生的事件數,事件的定義下文中會有描述。初始時 \(s\) 為空。
接下來 \(n−1\) 行,每行兩個正整數 \(x,y\),表示點 \(x\) 和點 \(y\) 之間有一條無向邊。
接下來 \(m\) 行,每行描述乙個事件,每行的第乙個數 \(type\) 表示事件的型別。
若 \(type=1\),那麼接下來有四個正整數 \(x,y,u,v\),表示先刪除連線點 \(x\) 和點 \(y\) 的無向邊,保證存在這樣的無向邊,然後加入一條連線點 \(u\) 和點 \(v\) 的無向邊,保證操作後的圖仍然滿足題中所述條件。
若 \(type=2\),那麼接下來有兩個正整數 \(x,y\),表示在 \(s\) 中加入點對 \((x,y)\) 。
若 \(type=3\),那麼接下來有乙個正整數 \(x\),表示刪除第 \(x\) 個加入 \(s\) 中的點對,即在第 \(x\) 個 \(type=2\) 的事件中加入 \(s\) 中的點對,保證這個點對存在且仍然在 \(s\) 中。
若 \(type=4\),那麼接下來有兩個正整數 \(x,y\),表示小l詢問守在連線點 \(x\) 和點 \(y\) 的邊上是否一定能見到共價大爺,保證存在這樣的無向邊且此時 \(s\) 不為空。
對於每個小l的詢問,輸出「yes」或者「no」(均不含引號)表示小l一定能或者不一定能見到共價大爺。
0
5 71 2
1 32 4
1 52 1 5
1 1 5 2 5
4 2 5
2 1 4
4 2 5
3 14 2 4
yes
noyes
最開始將點對 \((1,5)\) 加入到 \(s\) 中,此時點 \(1\) 和點 \(5\) 之間的路徑是 \(1→5\)。
接著將連線點 \(1\) 和點 \(5\) 的邊斷開,加入連線點 \(2\) 和點 \(5\) 的邊,我們發現圖仍然滿足題中所述條件,且點 \(1\) 和點 \(5\) 之間的路徑是 \(1→2→5\),經過點了 \(2\) 和點 \(5\) 之間的邊,因此第乙個詢問答案是 yes。
接著將點對 \((1,4)\) 加入到 \(s\) 中,點 \(1\) 和點 \(4\) 之間的路徑是 \(1→2→4\),沒有經過點 \(2\) 和點 \(5\) 之間的邊,因此第二個詢問答案是 no。
接著,我們刪除了第乙個加入到 \(s\) 中的點對,也就是點對 \((1,5)\),此時 \(s\) 中唯一的點對就是 \((1,4)\),經過了點 \(2\) 和點 \(4\) 之間的邊,因此最後乙個詢問答案是 yes。
每組測試資料的限制與約定如下所示:
測試點編號
$n$
$m$
$type=$
限制與約定
$1$
$n≤100$
$m≤100$
$1,2,3,4$
$2$
$n≤100000$
$m≤300000$
$2,4$
$3$
$4$
$2,3,4$
$5$
$6$
$1,2,3,4$
任意時刻 $|s|≤10$
$7$
$8$
$9$
$10$
時間限制:\(2s\)
空間限制:\(512mb\)
matthew99
orz 毛爺爺
這題很巧妙地利用了異或的自反性啊
毛爺爺的題解應該說得很清楚了
實際上就是
對於每次加入 \(s\) 點集的點對,把兩個端點都異或上乙個隨機數
那麼如果一條邊 \((u,v)\) 被所有的點對經過
我們把 \(u\) 變成根,那就一定會有 \(v\) 所在的子樹的異或和等於所有點對的異或和,因為每個點對一定會恰好有且僅有乙個端點在 \(v\) 所在的子樹內嘛
所以用lct來維護子樹資訊,每次查詢看兩個異或和是否相等就可以了
這題目真的巧妙
(如果你用的是srand,然後被hack了,可以試試把你srand的數換成time(0))
#include#define ll long long
#define db double
#define ld long double
const int maxn=100000+10,maxm=300000+10;
int n,m,sval,sn;
struct edge;
edge s[maxm];
#define lc(x) ch[(x)][0]
#define rc(x) ch[(x)][1]
struct lct
inline void reverse(int x)
inline void pushup(int x)
inline void pushdown(int x) }
inline void rotate(int x)
inline void splay(int x)
inline void access(int x) }
inline void makeroot(int x)
inline void split(int x,int y)
inline void link(int x,int y)
inline void cut(int x,int y) };
lct t;
#undef lc
#undef rc
templateinline void read(t &x)
templateinline void write(t x,char c='\0')
templateinline void chkmin(t &x,t y)
templateinline t min(t x,t y)
int main()
while(m--)
if(opt==2)
if(opt==3)
if(opt==4)
}return 0;
}
uoj 207 共價大爺遊長沙
miaom又來做lct了!lych 無敵 由於不是很懂lct子樹資訊維護的那套理論,想了好久 搞得樹剖的子樹維護就會了一樣!首先是乙個很巧妙的轉化 將邊在鏈上轉化為這條邊能將鏈的頂點分開。給每組頂賦乙個隨機權,每次可以把邊斷掉,查詢每個聯通塊內權值異或和是否等於所有頂點權值異或和,就是子樹異或和。然...
UOJ207 共價大爺遊長沙
uoj 神題 給每個點對隨機乙個權值,把這兩個點的權值異或上這個隨機的值 用l ctl ct 維護子樹資訊,若子樹異或和為所有點對的異或和那麼就是答案 大常數 include define rg register define il inline define fill a,b memset a,b...
UOJ207 共價大爺遊長沙
link 我們知道一條邊被所有路徑經過就是其乙個端點的子樹中包含了所有路徑的一端。那麼我們可以給每條路徑的端點rand乙個隨機權值,然後用lct維護子樹異或和,查詢就是看子樹異或和是否等於所有隨機權值的異或和。lct維護子樹資訊 單點修改就是多維護乙個虛子樹資訊,改變虛邊的時候修改一下就好了。這個方...