給你一顆由\(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...