計算神經學作為新興的交叉學科近些年來一直是學術界的熱點。一種叫做shoi 的神經組織因為其和近日發現的化合物 shtsc 的密切聯絡引起了人們的極大關注。
shoi 組織由若干個 shoi 細胞構成,shoi 細胞之間形成嚴密的樹形結構。每個 shoi 細胞都有且只有乙個輸出端,被稱為軸突,除了乙個特殊的、被稱為根細胞的 shoi 細胞的輸出作為整個組織的輸出以外,其餘細胞的軸突均連向其上級 shoi 細胞;並且有且只有三個接收端,被稱為樹突,從其下級細胞或者其它神經組織那裡接收資訊。shoi 細胞的訊號機制較為簡單,僅有 \(0\)和 \(1\)兩種。每個 shoi 細胞根據三個輸入端中 \(0\)和 \(1\)訊號的多寡輸出較多的那一種。
現在給出了一段 shoi 組織的資訊,以及外部神經組織的輸入變化情況。請你模擬 shoi 組織的輸出結果。
輸入的第一行包含乙個整數 \(n\)。表示 shoi 組織的總細胞個數。shoi 細胞由 \(1\)~ \(n\) 編號,編號為 \(1\) 的是根細胞。
從第二行開始的 \(n\)行,每行三個整數 \(x_1, x_2, x_3\),分別表示編號為 \(1\)~ \(n\) 的 shoi 細胞的樹突連線。\(1 < x_i \leq n\) 表示連向編號為 \(x_i\) 的細胞的軸突, \(n < x_i \leq 3n+1\) 表示連向編號為 \(x_i\) 的外界輸入。輸入資料保證給出的 shoi 組織是合法的,且所有的 \(x_i\) 兩兩不同。
接下來一行包含 \(2n+1\) 個 \(0/1\) 的整數,表示初始時的外界輸入。
第 \(n+3\)行有乙個整數 \(q\),表示總算子。
之後 \(q\) 行每行乙個整數 \(x\),表示編號為 \(x\) 的外界輸入發生了變化。
輸出 \(q\) 行,每行乙個整數,對應第 \(i\) 次外界輸入變化後的根細胞的輸出。
3
2 3 4
5 6 7
8 9 10
0 0 0 0 1 1 154
4568
100
11
對於 \(10 \%\)的資料, \(n \leq 1000, q \leq 1000\)。
對於 \(30 \%\)的資料, \(n \leq 100000, q \leq 100000\)。
對於 \(100 \%\)的資料, \(n \leq 500000, q \leq 500000\)。
這毒瘤題讀了半天沒看懂啥意思,現在簡單概括一下題意
給你一顆三叉樹(模擬二叉樹qwq),1為根,前n個點每個點有三個孩子,\(n+1\to3n\)這些點為葉子節點,然後給你所有葉子的權值0/1,定義\(1-n\)點的權值為,三個孩子中權為1的孩子的個數是否大於1,如果是則權值為1,否則為0。現在給你一些操作,每次讓乙個葉子的權值異或1,每次操作輸出根的權值
我們考慮每次操作對答案的影響,設\(v_i\)為i有多少個權值為1的孩子\(v_i\in [0,3]\)
如果當前點權值由0變1,那麼什麼情況下父親的權值也會改變呢
顯然當且僅當父親的v=1,那麼加上自己的改變, 父親的v變為2,這時父親的權值也從原來的0變為1,這就是乙個子問題了
同理,如果是1變0, 當且僅當父親的v=2時父親也會改變
那麼,我們可以得到乙個結論,每次修改乙個點產生的影響是從這個點向上一條連續v為1或2的鏈的權值的改變,只要這個鏈包括了1, 答案就會改變
那麼現在的問題是,怎麼快速維護這個東西,我們需要快速找到乙個點向上延伸1/2的最上面那個點,還有一條鏈的權值的修改
可以用lct維護這個東西, 顯然不需要makeroot操作,那麼翻轉標記就沒用了
每個點維護兩個點的指標,乙個是最深的v!=1的點,乙個是最深的v!=2的點
這個點實際上就是延伸的鏈頂的父親
為什麼要最深? 因為要保證下面的1/2連續
怎麼維護? 因為要最深,所以在splay上,先考慮右兒子,然後是自己,最後是左兒子
如果這個點存在,那麼就對答案沒有影響(仔細想想),我們把這個點轉上去,那麼實際上就是當前點的單點修改,右子樹整體的修改,這個打標記即可,注意v改變了,n1和n2要互換!
如果不存在呢,說明此鏈一直延伸到根,那麼直接對整個splay打標記,並把答案修改即可
這題就沒了。。。
發現實際上每個點的權值就是\(\frac v 2\),所以直接維護v就行了
#include#define ll long long
ll in()
const int maxn = 5e5 + 3;
const int maxm = 1.5e6 + 3;
struct node
void trn()
void dwn()
void upd()
bool isr()
bool ntr()
}pool[maxn];
int fa[maxm], val[maxm], du[maxm];
int n, ans;
void toposort()
pool[1].fa = null;
}void rot(node *x)
void splay(node *o)
}void access(node *x)
int main()
else ans ^= 1, o->trn(), o->upd();
printf("%d\n", ans);
} return 0;
}
SHOI2014 三叉神經樹
給你一顆由 n 個非葉子結點和 2n 1 個葉子結點構成的三叉樹,每個結點兒子個數為 0 3 每個葉子結點有乙個輸出 0 或 1 每個非葉子結點的輸出為自己的葉子結點中較多的那一種狀態。有 q 次修改操作,每次修改乙個葉子結點的輸出,求每次修改後根結點的輸出。n leq 5 times 10 5,q...
SHOI2014 三叉神經樹
題目描述 計算神經學作為新興的交叉學科近些年來一直是學術界的熱點。一種叫做shoi 的神經組織因為其和近日發現的化合物 shtsc 的密切聯絡引起了人們的極大關注。shoi 組織由若干個 shoi 細胞構成,shoi 細胞之間形成嚴密的樹形結構。每個 shoi 細胞都有且只有乙個輸出端,被稱為軸突,...
SHOI2014 三叉神經樹 LCT
題面 loj 2187 解析 顯然修改一次需要修改一條到根的鏈,維護鏈當然就想到用lct了 結果就想偏了,本來想分別維護虛子樹資訊與整棵子樹資訊,結果發現很難維護。然後去自學了一發 我們定義乙個點的點權為它的兒子節點中選 1 的個數 考慮更改乙個點的點權要麼對它上方的鏈中連續的 1 或連續 2 因此...