Loj題解 10132 異象石

2022-06-26 09:48:08 字數 1443 閱讀 8053

目錄

給定一棵 \(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...