传送门(下面也有题面)

题目大意:

  一颗有根树,每个非叶子节点都有三个子节点,每个节点的权为0/1。

  每个节点的权 取决于其所有子节点中 哪种权出现的次数更多。

  有若干次询问,每次询问修改一个叶子节点的权,然后输出修改后根节点的权。

  给出叶子节点初始值。

解法:树链剖分+线段树

  叶子节点和非叶子节点的性质不同,为了省却麻烦,我们把叶子节点去掉,

  每次修改叶子节点就直接修改其父亲。以下的“叶子节点”均指处理后的树的叶子节点。

  如果用num[]记录每个节点的权为1的子节点个数,

  那么当num[i]>1时,点i权为1;当num[i]<=1时,权为0。

  记fa[i]表示i节点的父亲节点。

  可以推出:

    当num[i]=1时num[i]++,那么num[fa[i]]++;

    当num[i]=2时num[i]--,那么num[fa[i]]--;

  于是就有一个暴力算法,如果修改的当前点的num满足条件,就向上修改。

  其实就相当于使从根到叶子节点的链上最后一个num!=1(2)的点到叶子节点的区间权值+(-)1;

  然后就可以用树链剖分+线段树愉快的AC了。

代码:

 #include<bits/stdc++.h>
using namespace std;
#define N ((1<<19)-1) int n,cnt;
int fir[N],size[N],pt[N],pos[N],fa[N<<],data[N<<],ori[N]; struct edge{
int to,n;
edge(){} edge(int _to,int _n){to=_to,n=_n;}
};
vector<edge>e; struct SN{
int num,flag;
SN*son[];
}sn[N<<],*root; void putin()
{
int i,j,x;
scanf("%d",&n);
e.push_back(edge());
for (i=;i<=n;i++)
for (j=;j<;j++)
{
scanf("%d",&x);
fa[x]=i;
if (x<=n)
{
e.push_back(edge(x,fir[i]));
fir[i]=e.size()-;
}
}
} void pre(int x)
{
size[x]=;pt[x]=;
for (int i=fir[x];i;i=e[i].n)
{
pre(e[i].to);
size[x]+=size[e[i].to];
if (size[e[i].to]>size[pt[x]]) pt[x]=e[i].to;
}
} void getpath(int x)
{
pos[x]=++cnt;
if (pt[x])
{
ori[pt[x]]=ori[x];
getpath(pt[x]);
}
for (int i=fir[x];i;i=e[i].n)
{
if (e[i].to==pt[x]) continue;
ori[e[i].to]=e[i].to;
getpath(e[i].to);
}
} void build(SN&x,int l,int r)
{
x.flag=-;
if (l==r) return;
x.son[]=&sn[++cnt];
x.son[]=&sn[++cnt];
int m=(l+r)>>;
build(*x.son[],l,m);
build(*x.son[],m+,r);
} void update(SN&x)
{
for (int i=;i<;i++)
{
SN&z=*x.son[i];
z.num=z.flag=x.flag;
}
x.flag=-;
} bool change(SN&x,int l,int r,int i,int j,int &p,int &v)
{
if (i<=l&&r<=j&&x.num==p)
{
x.num+=v;
x.flag=x.num;
return ;
}
if (l==r)
{
x.num+=v;
return ;
}
if (x.flag!=-) update(x);
int m=(l+r)>>;
bool re=;
if (m<j) re=change(*x.son[],m+,r,i,j,p,v);
if (!re&&i<=m) re=change(*x.son[],l,m,i,j,p,v);
x.num=-;
if ((*x.son[]).num==(*x.son[]).num)x.num=(*x.son[]).num;
return re;
} void work(int x)
{
int p,v;
if (data[x])
{
data[x]=;
p=,v=-;
}
else
{
data[x]=;
p=,v=;
}
x=fa[x];
while (x)
{
if (change(*root,,n,pos[ori[x]],pos[x],p,v)) return;
x=fa[ori[x]];
}
} void initialize()
{
int x;
for (int i=n+;i<=*n+;i++)
{
scanf("%d",&x);
if (x) work(i);
}
} int SR(SN&x,int r)
{
if (r==) return x.num;
if (x.flag!=-) update(x);
return SR(*x.son[],(+r)>>);
} void respond()
{
int q,x,temp;
scanf("%d",&q);
for (int i=;i<q;i++)
{
scanf("%d",&x);
work(x);
temp=SR(*root,n);
if (temp>) printf("%d\n",);
else printf("%d\n",);
}
} int main()
{
putin();
pre();
ori[]=;
getpath();
cnt=;
root=&sn[];
build(*root,,n);
initialize();
respond();
}

BZOJ3553

说好的题面:

3553: [Shoi2014]三叉神经树

Time Limit: 160 Sec  Memory Limit: 256 MB

Description

计算神经学作为新兴的交叉学科近些年来一直是学术界的热点。一种叫做SHOI 的神经组织因为其和近日发现的化合物 SHTSC 的密切联系引起了人们的极大关注。
SHOI 组织由若干个 SHOI 细胞构成,SHOI 细胞之间形成严密的树形结构。
每个 SHOI 细胞都有且只有一个输出端,被称为轴突,除了一个特殊的、被称为根细胞的 SHOI
细胞的输出作为整个组织的输出以外,其余细胞的轴突均连向其上级 SHOI
细胞;并且有且只有三个接收端,被称为树突,从其下级细胞或者其它神经组织那里接收信息。SHOI 细胞的信号机制较为简单,仅有 0 和 1
两种。每个 SHOI 细胞根据三个输入端中 0 和 1 信号的多寡输出较多的那一种。
现在给出了一段 SHOI 组织的信息,以及外部神经组织的输入变化情况。请你模拟 SHOI 组织的输出结果。

Input

第一行一个整数: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 的外界输入发生了变化。

Output

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

Sample Input

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

Sample Output

1
0
0
1
1

HINT

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

[BZOJ 3553][SHOI2014]三叉神经树的更多相关文章

  1. BZOJ 3553: [Shoi2014]三叉神经树 LCT

    犯傻了,想到了如果是 0->1 的话就找最深的非 1 编号,是 1 -> 0 的话就找最深的非 0 编号. 但是没有想到这个东西可以直接维护. 假设不考虑叶子节点,那么如果当前点的值是 1 ...

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

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

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

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

  4. [SHOI2014]三叉神经树

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

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

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

  6. P4332 [SHOI2014]三叉神经树(LCT)

    Luogu4332 LOJ2187 题解 代码-Tea 题意 : 每个点有三个儿子 , 给定叶节点的权值\(0\)或\(1\)且支持修改 , 非叶子节点的权值为当有\(>=2\)个儿子的权值为\ ...

  7. P4332 [SHOI2014]三叉神经树

    \(\color{#0066ff}{ 题目描述 }\) 计算神经学作为新兴的交叉学科近些年来一直是学术界的热点.一种叫做SHOI 的神经组织因为其和近日发现的化合物 SHTSC 的密切联系引起了人们的 ...

  8. 洛谷P4332 [SHOI2014]三叉神经树(LCT)

    传送门 FlashHu大佬太强啦%%% 首先,我们可以根据每一个点的权值为$1$的儿子的个数把每个点记为$0~3$,表示这一个点的点权 先考虑一下暴力的过程,假设从$0$变为$1$,先更改一个叶子结点 ...

  9. 洛谷4322 SHOI2014 三叉神经树(LCT+思维)

    好久之前做的题了QWQ 现在来补一发博客 一道神仙题啊..qwq 首先,我们可以看出来,我们如果对于每个点维护一个\(val\),表示他的直系儿子中有几个表现为1的. 那么\(val[x]>&g ...

随机推荐

  1. 【洛谷 P2513】 [HAOI2009]逆序对数列(DP)

    题目链接 这种求方案数的题一般都是\(dp\)吧. 注意到范围里\(k\)和\(n\)的范围一样大,\(k\)是完全可以更大的,到\(n\)的平方级别,所以这暗示了我们要把\(k\)写到状态里. \( ...

  2. HDU 1599 find the mincost route (最短路 floyd)

    题目链接 Problem Description 杭州有N个景区,景区之间有一些双向的路来连接,现在8600想找一条旅游路线,这个路线从A点出发并且最后回到A点,假设经过的路线为V1,V2,....V ...

  3. C#读取txt文件时中文乱码

    解决办法 使用GB2312中文字符集 StreamReader reader = new StreamReader(txtUrl, Encoding.GetEncoding("gb2312& ...

  4. SpringCloud Feign重试详解

    摘要: 今天在生产环境发生了数据库进程卡死的现象,除了sql因为全量更新,没加索引的原因,最主要还是我们的接口的服务器端接口出现问题了.忽视了更新接口的幂等性,以及调用方feign client的重试 ...

  5. CentOS7安装MySQL5.7以及修改密码

    CentOS7安装mysql [root@bd005 ~]# wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch. ...

  6. 任务调度框架kunka

    kunka kunka是一个任务调度框架.用户只需要在Task接口中实现自己要执行的功能,并且选择合适的执行器,放入TaskManager中,就可以了完成整个任务了. 实现细节 整个任务信息存放在内存 ...

  7. Python标准库笔记(1) — string模块

    String模块包含大量实用常量和类,以及一些过时的遗留功能,并还可用作字符串操作. 1. 常用方法 常用方法 描述 str.capitalize() 把字符串的首字母大写 str.center(wi ...

  8. map,set的底层实现:红黑树[多图,手机慎入]

    最近天下有一种颇不太平的感觉,各地的乱刀砍人,到处是贪官服法.京东准备上市了,阿里最近也提交申请了,猎豹也逆袭了,据说猎豹移动在国际市场上表现甚是抢眼.只有屌丝还在写着代码.花开花又谢,花谢花又开,为 ...

  9. mount/umount命令【转】

    转自:http://www.cnblogs.com/qq78292959/archive/2012/03/06/2382334.html 如果想在运行的Linux下访问其它文件系统中的资源的话,就要用 ...

  10. sunos kernel src leakrs

    https://github.com/joede/libezV24 https://github.com/ysei/siriusSparcV8 https://github.com/omniti-la ...