計算神經學作為新興的交叉學科近些年來一直是學術界的熱點。一種叫做shoi 的神經組織因為其和近日發現的化合物 shtsc 的密切聯絡引起了人們的極大關注。
shoi 組織由若干個 shoi 細胞構成,shoi 細胞之間形成嚴密的樹形結構。
每個 shoi 細胞都有且只有乙個輸出端,被稱為軸突,除了乙個特殊的、被稱為根細胞的 shoi 細胞的輸出作為整個組織的輸出以外,其餘細胞的軸突均連向其上級 shoi 細胞;並且有且只有三個接收端,被稱為樹突,從其下級細胞或者其它神經組織那裡接收資訊。shoi 細胞的訊號機制較為簡單,僅有 0 和 1 兩種。每個 shoi 細胞根據三個輸入端中 0 和 1 訊號的多寡輸出較多的那一種。
input
現在給出了一段 shoi 組織的資訊,以及外部神經組織的輸入變化情況。請你模擬 shoi 組織的輸出結果。
第一行乙個整數:n。表示 shoi 組織的總細胞個數。shoi 細胞由 1~n 編號,編號為 1 的是根細胞。
從第二行開始的 n 行,每行三個整數 x1, x2, x3,分別表示編號為 1~n 的 shoi 細胞的樹突連線。1<xi≤n 表示連向編號為 xi 的細胞的軸突, n<xi≤3n+1 表
示連向編號為 xi 的外界輸入。輸入資料保證給出的 shoi 組織是合法的且所有的 xi 兩兩不同。
接下來一行 2n+1 個 0/1 的整數,表示初始時的外界輸入。
第 n+3 行有乙個整數:q,表示總算子。
之後 q 行每行乙個整數 x,表示編號為 x 的外界輸入發生了變化。
由於乙個非葉子節點x有三個兒子,每個兒子對x要麼輸出0,要麼輸出1。
那麼x有4個狀態0,1,2,3。
很容易想到,1和2如果一修改的話,整條1/2鏈都要修改。
乙個外接點x發生了變化,那麼fa[x]的值一定會變。
那麼我們需要找到fa[x]到根節點的第乙個不是1/2的點y。然後斷開。
但是如果我們只維護每個點究竟是0/1/2/3,這樣是不可行的,因為斷開之後新的兩條鏈很難修改,特別地,如果有幾個分支值都是1/2的話,這樣維護起來更麻煩。
所以需要維護乙個值,能夠代表整個區間中的某段連續的值。
我就卡在這裡了。
zjq的方法:lct,維護相同的一串最長是多長。
ch的方法:維護df
s 序在[l
,r] 範圍內,狀態為0/1/2/3的最右邊的點。
由於我們要求從下往上第乙個跟最下面不同的點,那麼可以去找這段區間內最後乙個相同的點。
比如說找第乙個不是狀態2的節點,那麼可以找從r到l的最後乙個2的點。
則區間[l,
r]中max
(a0,
a1,a
3)就是從右往左第乙個不是2的點。
這是樹鏈剖分,且每次只求根節點到某個點的一條鏈。
所以dfs序相鄰的點都在一條鏈上,不會出現dfs序相鄰的點出現在不同的子樹中這種情況。
#include
#include
#include
#include
#include
#define n 500010
#define p(a) putchar(a)
#define fo(i,a,b) for(i=a;i<=b;i++)
#define fd(i,a,b) for(i=a;i>=b;i--)
using namespace std;
struct note;note edge[n*3];
struct note1;note1 tr[n*4];
int head[n],head1[n],tot;
int st[n];
int i,j,k,l,n,m,q;
int val[n*3],fa[n*3];
int siz[n],top[n],hv[n];
int dfn[n],tar[n],t;
int d[n*3];bool bz[n];
int u,v,w,x,y,t1,t2;
int max(int
x,int
y)int
read()
void lb(int
x,int
y)void dg1(int
x) if(!p)
st[0]--;}}
}void dg2(int
x) }
if(!p)
if(!p)st[0]--;}}
}void update(int ps)
void downld(int ps,int l,int r)
}int find(int ps,int l,int r,int
x) downld(ps,l,r);
int wz=(l+r)>>1,res;
if(x
<=wz)res=find(ps<<1,l,wz,x);
else res=find(ps<<1|1,wz+1,r,x);
update(ps);
return res;
}int getr(int ps,int l,int r,int
x,int
y,int z)
downld(ps,l,r);
int wz=(l+r)>>1,res;
if(y
<=wz)res=getr(ps<<1,l,wz,x,y,z);else
if(x>wz)res=getr(ps<<1|1,wz+1,r,x,y,z);else
res=max(getr(ps<<1,l,wz,x,wz,z),getr(ps<<1|1,wz+1,r,wz+1,y,z));
update(ps);
return res;
}void modify(int ps,int l,int r,int
x,int
y,int z)
downld(ps,l,r);
int wz=(l+r)>>1;
if(y
<=wz)modify(ps<<1,l,wz,x,y,z);else
if(x>wz)modify(ps<<1|1,wz+1,r,x,y,z);else
update(ps);
}void bfs()
fd(i,r,1)
}int main()
fo(i,1,n)top[i]=i;
dg1(1);
dg2(1);
fo(i,n+1,3
*n+1)val[i]=read(),val[fa[i]]+=val[i];
bfs();
q=read();
while(q--)
v=fa[top[v]];
}}else
v=fa[top[v]];}}
val[u]^=1;
if(find(1,1,n,1)>1)p('1');else p('0');
p('\n');
}return
0;}
SHTSC2014 三叉神經樹
輸出 q行每乙個整數,對應第 i次外界輸入變化後的根細胞的輸出。給一棵根為1的三叉 傻叉神經樹 樹,非葉子節點必有三個兒子,每個節點會儲存01資訊,每次只改變乙個葉子節點的資訊,某非葉子節點的01值會相應改變,取值為三個兒子的資訊中較多的那個 比如,某節點x三個兒子資訊為011,則x的資訊為1 問每...
SHOI2014 三叉神經樹
給你一顆由 n 個非葉子結點和 2n 1 個葉子結點構成的三叉樹,每個結點兒子個數為 0 3 每個葉子結點有乙個輸出 0 或 1 每個非葉子結點的輸出為自己的葉子結點中較多的那一種狀態。有 q 次修改操作,每次修改乙個葉子結點的輸出,求每次修改後根結點的輸出。n leq 5 times 10 5,q...
SHOI2014 三叉神經樹
題目描述 計算神經學作為新興的交叉學科近些年來一直是學術界的熱點。一種叫做shoi 的神經組織因為其和近日發現的化合物 shtsc 的密切聯絡引起了人們的極大關注。shoi 組織由若干個 shoi 細胞構成,shoi 細胞之間形成嚴密的樹形結構。每個 shoi 細胞都有且只有乙個輸出端,被稱為軸突,...