SHOI2014 三叉神經樹 解題報告

2022-04-29 22:00:15 字數 1233 閱讀 5202

膜拜神仙思路

我們想做乙個類似於動態dp的東西,首先得確保我們的運算有乙個交換律,這樣我們可以把一長串的運算轉換成一塊一塊的放到矩陣上之類的東西,然後拿資料結構維護。

但是考慮這個題,它最下面的那個運算的輸入端只有兩種可能,於是我們只需要討論一下初始輸入就完事了。

具體的,\(lct\)每條實鏈維護乙個\(yuu[i][0/1]\)表示實鏈底端的點輸入為\(0/1\)後鏈頭輸出什麼。

注意,這個鏈頭指的是\(splay\)中那個點\(i\)的子樹代表的那條鏈,也就是說鏈頭是點\(i\)子樹最左邊的點。

那麼單獨的乙個點沒有實兒子一定輸入\(0\),因為最深的兒子沒有實兒子,於是整個鏈的輸入也是\(0\)。

當然我們肯定需要維護乙個虛兒子的資訊,它可以使某一條鏈(splay中的某子樹)的輸出為\(1\)然後再傳給它的父親之類的

另外,\(yuu\)的全稱是小糸侑(\(koito \ yuu\))

code:

#include #include #define ls ch[now][0]

#define rs ch[now][1]

#define fa par[now]

const int n=2e6+10;

template void read(t &x)

int yuu[n][2],ch[n][2],par[n],bee[n],si[n],n,q;

void updata(int now)

if(ls) }

int identity(int now)

int isroot(int now)

void connect(int f,int now,int typ)

void rotate(int now)

void splay(int now)

void access(int now)

}int head[n],to[n],next[n],cnt;

void add(int u,int v)

void dfs(int now)

int main()

for(int i=n+1;i<=3*n+1;i++) read(bee[i]);

dfs(1);

read(q);

for(int x,now,i=1;i<=q;i++)

return 0;

}

2019.2.24

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 因此...