題目描述
計算神經學作為新興的交叉學科近些年來一直是學術界的熱點。一種叫做shoi 的神經組織因為其和近日發現的化合物 shtsc 的密切聯絡引起了人們的極大關注。
shoi 組織由若干個 shoi 細胞構成,shoi 細胞之間形成嚴密的樹形結構。每個 shoi 細胞都有且只有乙個輸出端,被稱為軸突,除了乙個特殊的、被稱為根細胞的 shoi 細胞的輸出作為整個組織的輸出以外,其餘細胞的軸突均連向其上級 shoi 細胞;並且有且只有三個接收端,被稱為樹突,從其下級細胞或者其它神經組織那裡接收資訊。shoi 細胞的訊號機制較為簡單,僅有 00和 11兩種。每個 shoi 細胞根據三個輸入端中 00和 11訊號的多寡輸出較多的那一種。
現在給出了一段 shoi 組織的資訊,以及外部神經組織的輸入變化情況。請你模擬 shoi 組織的輸出結果。
題解
身體啊。
先考慮每一次修改能影響到的範圍,這個比較簡單,只能是這個點到根的路徑上的所有點。
再次進一步的考慮,發現能夠影響到的範圍是一段連續的區間。
考慮為什麼題目中給的是一顆每個點有三個兒子的樹?如果乙個節點時是1,那麼它的1的兒子樹時2或3,也就是d>>1=1,所以我們判斷乙個節點是否是被啟用的就可以用度數/2來判斷。
然後考慮某個葉子從1->0的時候,那麼有修改的就是從這個葉子往上連續的一段2,和第乙個不是2的點。
反之就是往上連續一段1和第乙個不是1的點。
這是乙個非常重要的性質,有了這個性質之後就可以二分最靠下的不是1/2的點,用&*%*#資料結構維護一下。
題解給的lct做法非常喵。
我們不用二分,直接在lct每個節點維護當前鏈中深度最深的不是1/2的點。
但是有個問題,這是一顆有根樹,我們不能makeroot。
那麼如何提取一條鏈?
假設我們的葉子為x,鏈頂為y,那麼access&&splay(x)之後,當前的splay就是從葉子到根的一條鏈。
然後再splay(y)此時y的右子樹就是我們要的鏈了。
我的寫法如果第乙個不是1/2的點是根的話要特判,為啥網上的題解都不同特判啊。。
**
#include#include#include
#define n 500009
#define ls ch[x][0]
#define rs ch[x][1]
using
namespace
std;
queue
q;int ch[n][2],fa[n],v[n*3],rev[n],n1[n],n2[n],n,f[n*3
],du[n];
typedef
long
long
ll;inline ll rd()
while(isdigit(c))
return f?-x:x;
}inline
bool ge(int x)
inline
bool isroot(int x)
inline
void pushup(int
x)inline
void rotate(int
x)inline
void pushdown(int x,int
tag)
void _pushdown(int
x)inline
void splay(intx)}
inline
void access(int
x)int
main()
for(int i=n+1;i<=3*n+1;++i)v[i]=rd(),v[f[i]]+=v[i];
for(int i=1;i<=n;++i)if(!du[i])q.push(i);
while(!q.empty())
int ans=0
,qu;
ans=v[1]>>1
; qu=rd();
while(qu--)
else
if(ta==-1&&n2[x])
else
if(ans)puts("
1");else puts("0"
); }
return0;
}
SHOI2014 三叉神經樹
給你一顆由 n 個非葉子結點和 2n 1 個葉子結點構成的三叉樹,每個結點兒子個數為 0 3 每個葉子結點有乙個輸出 0 或 1 每個非葉子結點的輸出為自己的葉子結點中較多的那一種狀態。有 q 次修改操作,每次修改乙個葉子結點的輸出,求每次修改後根結點的輸出。n leq 5 times 10 5,q...
SHOI2014 三叉神經樹 LCT
題面 loj 2187 解析 顯然修改一次需要修改一條到根的鏈,維護鏈當然就想到用lct了 結果就想偏了,本來想分別維護虛子樹資訊與整棵子樹資訊,結果發現很難維護。然後去自學了一發 我們定義乙個點的點權為它的兒子節點中選 1 的個數 考慮更改乙個點的點權要麼對它上方的鏈中連續的 1 或連續 2 因此...
SHOI2014 三叉神經樹 題解
lct 一顆節點數為 3n 1 的樹,編號在 1 dots n 的節點有且僅有三個兒子。其餘點沒有兒子。所有節點值只可能為 0 或 1 編號在 n 1 dots 3n 的節點的值由輸入確定,編號在 1 to n 的節點的值為三個兒子中值數量更多的那種。m 次操作,每次會改變乙個 n 1 dots 3...