三叉神经树 ( neuron )

题目描述

计算神经学作为新兴的交叉学科近些年来一直是学术界的热点。一种叫做SHOI 的神经组织因为其和近日发现的化合物SHTSC 的密切联系引起了人们的极大关注。

SHOI 组织由若干个SHOI 细胞构成,SHOI 细胞之间形成严密的树形结构。每个SHOI 细胞都有且只有一个输出端,被称为轴突,除了一个特殊的、被称为根细胞的SHOI 细胞的输出作为整个组织的输出以外,其余细胞的轴突均连向其上级SHOI 细胞;并且有且只有三个接收端,被称为树突,从其下级细胞或者其它神经组织那里接收信息。SHOI 细胞的信号机制较为简单,仅有0 和1 两种。每个SHOI 细胞根据三个输入端中0 和1 信号的多寡输出较多的那一种。

现在给出了一段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 的外界输入发生了变化。

输出

输出q 行每行一个整数,对应第i 次外界输入变化后的根细胞的输出。

样例输入

3
2 3 4
5 6 7
8 9 10
0 0 0 0 1 1 1
5
4
4
5
6
8

样例输出

1
0
0
1
1

提示

【数据规模】

对于10%的数据,n, q≤1000。

对于额外10%的数据,修改仅会将0 修改成1。

对于额外30%的数据,输入的SHOI 形成以根为端点的一条链。

对于100%的数据,n≤500000,q≤500000。

来源

SHTSC2014day2


假设num[i]表示i有几个1节点

每次相当于询问i到根路径上第一个num不等于1或不等于2的点,然后区间加。

于是又是这奇怪的线段树上查询

先查右区间,如果没有再查左区间

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 500005
using namespace std;
int n,head[maxn],son[maxn],top[maxn],size[maxn],fa[maxn*3];
int deep[maxn],dfn[maxn],sc,x1,x2,x3,tot,root,dy[maxn],ch[maxn][3],aa[maxn];
int val[maxn*3],Q,t,li,ri,op;
struct node{
int nex,v;
}e[maxn*2];
struct no{
int l,r,ma,mi,bj;
}tree[maxn*4];
void lj(int t1,int t2){
e[++tot].v=t2;e[tot].nex=head[t1];head[t1]=tot;
}
void dfs1(int k,int fath){
deep[k]=deep[fath]+1;
int gp=-1,sz=0;
for(int i=head[k];i;i=e[i].nex){
if(e[i].v!=fath){
dfs1(e[i].v,k);
if(gp==-1)gp=e[i].v;
if(size[e[i].v]>size[gp])gp=e[i].v;
sz+=size[e[i].v];
}
}
int co=0;
co+=val[ch[k][0]]+val[ch[k][1]]+val[ch[k][2]];
aa[k]=co;
if(co>1)val[k]=1;
son[k]=gp,size[k]=sz+1;
}
void dfs2(int k){
dfn[k]=++sc;dy[sc]=k;
if(son[k]!=-1)top[son[k]]=top[k],dfs2(son[k]);
for(int i=head[k];i;i=e[i].nex){
if(e[i].v!=son[k]&&e[i].v!=fa[k]){
top[e[i].v]=e[i].v;
dfs2(e[i].v);
}
}
}
void wh(int k){
tree[k].ma=max(tree[k*2].ma,tree[k*2+1].ma);
tree[k].mi=min(tree[k*2].mi,tree[k*2+1].mi);
}
void down(int k){
if(tree[k].bj!=0){
int fs=tree[k].bj;
tree[k*2].ma+=fs,tree[k*2].mi+=fs;tree[k*2].bj+=fs;
tree[k*2+1].ma+=fs,tree[k*2+1].mi+=fs;tree[k*2+1].bj+=fs;
tree[k].bj=0;
}
}
void build(int k,int L,int R){
tree[k].l=L,tree[k].r=R;
if(L==R){
tree[k].ma=tree[k].mi=aa[dy[L]];
return;
}
int mid=L+R>>1;
build(k*2,L,mid);build(k*2+1,mid+1,R);
wh(k);
}
int find(int k){
if(tree[k].l==tree[k].r){
if(tree[k].ma!=op)return tree[k].l;
else return 0;
}
if(tree[k].l>=li&&tree[k].r<=ri&&tree[k].ma==tree[k].mi&&tree[k].ma==op)return 0;
down(k);
int mid=tree[k].l+tree[k].r>>1,ans=0;
if(ri<=mid)return find(k*2);
if(li>mid)return find(k*2+1);
if(ri>mid)ans=find(k*2+1);
if(!ans&&li<mid)ans=find(k*2);
return ans;
}
void jia(int k){
if(tree[k].l>=li&&tree[k].r<=ri){
if(op==1)tree[k].ma++,tree[k].mi++,tree[k].bj++;
else tree[k].ma--,tree[k].mi--,tree[k].bj--;
return;
}
down(k);
int mid=tree[k].l+tree[k].r>>1;
if(li<=mid)jia(k*2);
if(ri>mid)jia(k*2+1);
wh(k);
}
int ask(int k){
//cout<<tree[k].l<<' '<<tree[k].r<<endl;
if(tree[k].l==tree[k].r)return tree[k].ma;
down(k);
return ask(k*2);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
scanf("%d%d%d",&x1,&x2,&x3);
fa[x1]=fa[x2]=fa[x3]=i;
ch[i][0]=x1,ch[i][1]=x2,ch[i][2]=x3;
if(x1<=n)lj(i,x1);
if(x2<=n)lj(i,x2);
if(x3<=n)lj(i,x3);
}
for(int i=1;i<=n;i++)if(!fa[i])root=i;
for(int i=n+1;i<=3*n+1;i++)scanf("%d",&val[i]);
dfs1(root,0);top[root]=root;dfs2(root);
build(1,1,n);
cin>>Q;
while(Q--){ scanf("%d",&t);val[t]^=1;
if(val[t]==1)op=1;else op=2;
int a=fa[t],t1=top[a];
while(a){
li=dfn[t1],ri=dfn[a];
int pl=find(1); if(pl){
li=pl,ri=dfn[a];
jia(1);break;
}
jia(1);
a=fa[t1];t1=top[a];
}
int ans=ask(1);
if(ans>1)puts("1");
else puts("0");
}
return 0;
}

三叉神经树 ( neuron )的更多相关文章

  1. 【BZOJ-3553】三叉神经树 树链剖分

    3553: [Shoi2014]三叉神经树 Time Limit: 160 Sec  Memory Limit: 256 MBSubmit: 347  Solved: 112[Submit][Stat ...

  2. 「SHOI2014」三叉神经树 解题报告

    「SHOI2014」三叉神经树 膜拜神仙思路 我们想做一个类似于动态dp的东西,首先得确保我们的运算有一个交换律,这样我们可以把一长串的运算转换成一块一块的放到矩阵上之类的东西,然后拿数据结构维护. ...

  3. [BZOJ 3553][SHOI2014]三叉神经树

    传送门(下面也有题面) 题目大意: 一颗有根树,每个非叶子节点都有三个子节点,每个节点的权为0/1. 每个节点的权 取决于其所有子节点中 哪种权出现的次数更多. 有若干次询问,每次询问修改一个叶子节点 ...

  4. 「SHOI2014」三叉神经树

    「SHOI2014」三叉神经树 给你一颗由\(n\)个非叶子结点和\(2n+1\)个叶子结点构成的完全三叉树,每个叶子结点有一个输出:\(0\)或\(1\),每个非叶子结点的输出为自己的叶子结点中较多 ...

  5. BZOJ3553 : [Shoi2014]三叉神经树

    设val[i]为i连出去的树突中输出值为0的个数 如果val[x]<=1,输出值为1,否则输出值为0 修改x就相当于val[f[i]]++或者val[f[i]]-- 用Link-cut Tree ...

  6. 3553: [Shoi2014]三叉神经树(树链剖分)

    这道题特别恶心,首先我们可以发现更改的就是出现连续的一或二,那么就用线段树+树链剖分找到这个范围 想到是不难想,就是打起来恶心罢了= = CODE: #include<cstdio> #i ...

  7. [SHOI2014]三叉神经树

    题目描述 计算神经学作为新兴的交叉学科近些年来一直是学术界的热点.一种叫做SHOI 的神经组织因为其和近日发现的化合物 SHTSC 的密切联系引起了人们的极大关注. SHOI 组织由若干个 SHOI ...

  8. 洛谷P4332 [SHOI2014]三叉神经树(LCT,树剖,二分查找,拓扑排序)

    洛谷题目传送门 你谷无题解于是来补一发 随便百度题解,发现了不少诸如树剖\(log^3\)LCT\(log^2\)的可怕描述...... 于是来想想怎么利用题目的性质,把复杂度降下来. 首先,每个点的 ...

  9. 【LOJ】#2187. 「SHOI2014」三叉神经树

    题解 可以发现每次修改的是这个点往上一条连续的链,如果我要把1改成0,需要满足这一段往上的一部分都有两个1 如果我要把0改成1,需要满足这一段往上的部分有两个0 对于每个点记录1的个数,发现我们只会把 ...

随机推荐

  1. 1.redis 安装

    1.https://redis.io/download. 2. $ wget http://download.redis.io/releases/redis-3.2.9.tar.gz $ .tar.g ...

  2. javaweb基础(31)_国际化(i18n)

    一.国际化开发概述 软件的国际化:软件开发时,要使它能同时应对世界不同地区和国家的访问,并针对不同地区和国家的访问,提供相应的.符合来访者阅读习惯的页面或数据. 国际化(internationaliz ...

  3. vscode wepy 用户自定义代码片段

    VSCode wepy 自定义代码片段 { "wepy-page": { "prefix": "wepy", "body" ...

  4. 使用eclipse导入web项目

    第一步 第二步 第三步 第四步 最后就多了一个web项目

  5. 关于Linux系统下zookeeper集群的搭建

    1.集群概述 1.1什么是集群 1.1.1集群概念 集群是一种计算机系统, 它通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作.在某种意义上,他们可以被看作是一台计算机.集群系 ...

  6. python3 题目 有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?

    方法一:for循环遍历 counter=0 for i in range(1,5): for j in range(1,5): for k in range(1,5): if i !=j and j ...

  7. (转)Xcode6中自动布局autolayout和sizeclass的使用

    Xcode6中自动布局autolayout和sizeclass的使用   一.关于自动布局(Autolayout) 在Xcode中,自动布局看似是一个很复杂的系统,在真正使用它之前,我也是这么认为的, ...

  8. V4L2学习(五)VIVI虚拟摄像头驱动

    概述 前面简单分析了内核中虚拟摄像头驱动 vivi 的框架与实现,本文参考 vivi 来写一个虚拟摄像头驱动,查询.设置视频格式相对简单,难点在于 vb2_buf 的处理过程. 数据采集流程分析 在我 ...

  9. P1605迷宫

    题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和 终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫 中移动有上下 ...

  10. 编译Kubelet二进制文件

    1. 环境 系统:CentOS 7.2 Go:1.10.3 Kubernetes:1.10.4 2. 安装最新版go 编译的Kubernetes 1.10.4要求go版本在1.9.3以上,使用下面的y ...