目錄
給定一棵 \(n\) 個結點的樹,邊有邊權,三種操作:乙個很神奇的結論
記乙個陣列 \(dfn\) ,用來存dfs序的每個節點
設現有的被標記的點的dfs序從小到大排序後的集合為 \(\\)
設兩個點 \(u, v\) 的距離為 \(dis_\)
那麼答案為 \(dis_ + dis_ + ... + dis_, x_k} + dis_\) 的一半
那麼我們用乙個資料結構維護標記的點的序列即可,維護的時候順便統計答案,詢問時直接輸出
我選擇splay,因為我不會set
對答案的統計:
當標記乙個點時,設這個點的dfs序為 \(x\),序列中上乙個點為 \(l\),下乙個點為 \(r\),那麼新增點的貢獻為
\[\large dis_ + dis_ - dis_
\]取消標記乙個點的處理方式類似(剛好反著)
注意序列裡維護的是結點的dfs序,而求dis是用的是結點的編號
如果序列中沒有 \(l\) 和 \(r\) 時注意特判一下
/*
work by: suzt_ilymics
knowledge: ??
time: o(??)
*/#include#include#include#include#include#define ll long long
#define int long long
#define orz cout<<"lkp ak ioi!"<1)
int oldroot = root;
if(!son[root][0] && !son[root][1]) else if(!son[root][0]) else if(!son[root][1]) else if(son[root][0] && son[root][1])
clear(oldroot), push_up(root);
} int queryrank(int val_)
int queryval(int rk_) else
rk_ -= cnt[now_];
now_ = rson;
}} }
int querypre(int val_)
int querynext(int val_)
}using namespace splay;
using namespace cut;
int get_dis(int u, int v)
signed main()
dfs(1, 0), dfs2(1, 1);
m = read();
char ch;
for(int i = 1, x, l, r; i <= m; ++i) else if(ch == '-') else
}return 0;
}
異象石 引理證明
adera是microsoft應用商店中的一款解謎遊戲。異象石是進入adera中異時空的引導物,在adera的異時空中有一張地圖。這張地圖上有n個點,有n 1條雙向邊把它們連通起來。起初地圖上沒有任何異象石,在接下來的m個時刻中,每個時刻會發生以下三種型別的事件之一 地圖的某個點上出現了異象石 已經...
NOIP模擬賽 異象石
adera是microsoft應用商店中的一款解謎遊戲。異象石是進入adera中異時空的引導物,在adera的異時空中有一張地圖。這張地圖上有n個點,有n 1條雙向邊把它們連通起來。起初地圖上沒有任何異象石,在接下來的m個時刻中,每個時刻會發生以下三種型別的事件之一 1.地圖的某個點上出現了異象石 ...
刷題 LCA set 異象石
被指標折磨得死去活來.所以這裡具體分析指標 題目描述 adera 是 microsoft 應用商店中的一款解謎遊戲。異象石是進入 adera 中異時空的引導物,在 adera 的異時空中有一張地圖。這張地圖上 有 n 個點,有 n 1 條雙向邊把它們連通起來。起初地圖上沒有任何異象石,在接下來的 m...