SHOI2014 三叉神經樹

2022-05-27 23:57:07 字數 2277 閱讀 9247

給你一顆由\(n\)個非葉子結點和\(2n+1\)個葉子結點構成的三叉樹,每個結點兒子個數為\(0/3\),每個葉子結點有乙個輸出:\(0\)或\(1\),每個非葉子結點的輸出為自己的葉子結點中較多的那一種狀態。

有\(q\)次修改操作,每次修改乙個葉子結點的輸出,求每次修改後根結點的輸出。

\(n\leq 5\times 10^5,q\leq 5\times 10^5\).

不難發現每個節點有兩種可能的情況:

​ 1.三個兒子輸出均為\(0/1\)。

​ 2.兩個兒子輸出為\(0/1\),剩下乙個兒子與之相反。

為了方便起見,我們簡稱第一種情況的點為1類點,第二種情況的點為2類點。

我們發現,乙個點的輸出被改變,只會影響它的連續若干位祖先。

同時,如果對1類點的任意乙個兒子進行修改操作,並不會影響它自身的輸出,同樣也不會影響這個點的任何乙個祖先,只是單純的把這個點變成了2類點罷了。

而如果對2類點的乙個兒子進行修改操作,則會有以下兩種可能的結果:

我們定義以下狀態:

這樣問題就變成了求連續的最長\(0/1\)鏈,在序列上可以利用線段樹上二分處理,而在樹上我們則考慮利用樹鏈剖分來進行維護。

當乙個葉子結點輸出修改後:

時間複雜度為\(\omicron(n\log^2 n)\).

這裡還要注意乙個額外的細節,我們的線段樹雖然維護了2類點的輸出,但1類點的輸出我們並不知曉,不過好在每次有關1類點的操作都是單點操作,所以我們可以額外開乙個陣列維護1類點的輸出。

#includeusing namespace std;

const int maxn=500005;

int n,q,fa[maxn*3],son[maxn][3],a[maxn*3];

int wss[maxn],topf[maxn],dfn[maxn],idx[maxn],dfs_clock,siz[maxn];

inline int read()

while(ch>='0'&&ch<='9') res=(res<<3)+(res<<1)+(ch-'0'),ch=getchar();

return res*f_f;

}namespace seg

inline void modify(int o)

inline void push_down(int o)

inline int update_tp(int o,int l,int r,int ql,int qr,int id)

return 0;

}if(l==r) return 0;

push_down(o);

res=update_tp(o<<1|1,mid+1,r,ql,qr,id);

if(res==mid+1)

push_up(o);

return res;

}push_down(o);

if(qr<=mid) res=update_tp(o<<1,l,mid,ql,qr,id);

else if(ql>mid) res=update_tp(o<<1|1,mid+1,r,ql,qr,id);

else

}push_up(o);

return res;

}inline void update_p(int o,int l,int r,int x,int v)

int mid=l+r>>1;

push_down(o);

if(x<=mid) update_p(o<<1,l,mid,x,v);

else update_p(o<<1|1,mid+1,r,x,v);

push_up(o);

}inline int query(int o,int l,int r,int x)

}inline void dfs1(int u,int cur)

int res=(a[u]<=1)?0:1;

if(cur) a[cur]+=res;

}inline void dfs2(int u,int cur)

}inline int update_range(int x,int id)

inline int get_p(int x)

int main()

}for (int i=n+1;i<=n*3+1;i++)

dfs1(1,0),dfs2(1,1);

q=read();

while(q--)

printf("%d\n",get_p(1));

}return 0;

}

SHOI2014 三叉神經樹

題目描述 計算神經學作為新興的交叉學科近些年來一直是學術界的熱點。一種叫做shoi 的神經組織因為其和近日發現的化合物 shtsc 的密切聯絡引起了人們的極大關注。shoi 組織由若干個 shoi 細胞構成,shoi 細胞之間形成嚴密的樹形結構。每個 shoi 細胞都有且只有乙個輸出端,被稱為軸突,...

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