SHTSC2014 三叉神經樹

2021-08-15 07:26:03 字數 3505 閱讀 6522

計算神經學作為新興的交叉學科近些年來一直是學術界的熱點。一種叫做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 細胞都有且只有乙個輸出端,被稱為軸突,...