Description

给定一棵树,边的颜色为黑或白,初始时全部为白色。维护两个操作:
1.查询u到根路径上的第一条黑色边的标号。
2.将u到v    路径上的所有边的颜色设为黑色。
Notice:这棵树的根节点为1

Input

第一行两个数n,m分别表示点数和操作数。
接下来n-?    1行,每行2个数u,v.表示一条u到v的边。
接下来m行,每行为以下格式:
1 v 表示第一个操作
2 v u 表示第二种操作

Output

对于每个询问,输出相应答案。如果不存在,输出0。

由于边只会由白变黑,所以总的边修改次数为O(n),用并查集维护每个点到根的路径上最深的白边位置,预处理出边的染色顺序

逆序处理操作,用并查集维护,一开始把所有点合并到到根路径上第一条黑边,每取消一次染色就把边的下侧节点合并到上侧

#include<cstdio>
const int N=,R=;
char buf[R+],*ptr=buf-;
inline int _int(){
int x=,c=*++ptr;
while(c<)c=*++ptr;
while(c>)x=x*+c-,c=*++ptr;
return x;
}
int stk[],stp=;
inline void int_(int x){
if(!x)stk[++stp]=;
while(x)stk[++stp]=x%,x/=;
while(stp)putchar(stk[stp--]+);
putchar();
}
int n,m;
bool ed[N];
int f[N],q[N],ql,qr,dep[N],fa[N],id[N],aid[N];
int et[N*],enx[N*],e0[N],eid[N*],ep=;
int qs[N*],qw[N*],qp=,as[N],ap=;
inline int get(int x){
int a=x,c;
while(x!=f[x])x=f[x];
while(x!=(c=f[a]))f[a]=x,a=c;
return x;
}
int main(){
fread(buf,,R,stdin);
n=_int();m=_int();
for(int i=;i<=n;i++)f[i]=i;
for(int i=;i<n;i++){
int a=_int(),b=_int();
et[ep]=b;enx[ep]=e0[a];eid[ep]=i;e0[a]=ep++;
et[ep]=a;enx[ep]=e0[b];eid[ep]=i;e0[b]=ep++;
}
ql=qr=;
q[qr++]=;
dep[]=;
while(ql!=qr){
int w=q[ql++];
for(int i=e0[w];i;i=enx[i])if(int u=et[i]){
et[i^]=;
fa[u]=w;
id[u]=eid[i];
dep[q[qr++]=u]=dep[w]+;
}
}
for(int i=;i<m;i++)if(_int()==){
qs[qp]=;qw[qp++]=_int();
}else{
int a=get(_int()),b=get(_int());
while(a!=b){
if(dep[a]<dep[b]){int t=a;a=b;b=t;}
qw[qp++]=a;
aid[a]=id[a];
ed[a]=;
a=f[a]=get(fa[a]);
}
}
for(int i=;i<=n;i++)f[i]=i;
ql=qr=;
q[qr++]=;
while(ql!=qr){
int w=q[ql++];
for(int i=e0[w];i;i=enx[i])if(int u=et[i]){
if(ed[w]&&!ed[u])ed[u]=,f[get(u)]=get(w);
q[qr++]=u;
}
}
for(int i=qp-;~i;i--)
if(qs[i])as[ap++]=aid[get(qw[i])];
else f[get(qw[i])]=get(fa[qw[i]]);
while(ap)int_(as[--ap]);
return ;
}

bzoj3319: 黑白树的更多相关文章

  1. 【BZOJ3319】黑白树 并查集

    [BZOJ3319]黑白树 Description 给定一棵树,边的颜色为黑或白,初始时全部为白色.维护两个操作:1.查询u到根路径上的第一条黑色边的标号.2.将u到v    路径上的所有边的颜色设为 ...

  2. 【BZOJ】3319: 黑白树

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...

  3. 【BZOJ】3319: 黑白树(并查集+特殊的技巧/-树链剖分+线段树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 以为是模板题就复习了下hld............................. 然后n ...

  4. uoj #139. 【UER #4】被删除的黑白树 dfs序 贪心

    #139. [UER #4]被删除的黑白树 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/139 Descript ...

  5. [BZOJ 3319] 黑白树

    3319: 黑白树 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 557  Solved: 194[Submit][Status][Discuss] ...

  6. CodeM美团点评编程大赛初赛B轮 黑白树【DFS深搜+暴力】

    [编程题] 黑白树 时间限制:1秒 空间限制:32768K 一棵n个点的有根树,1号点为根,相邻的两个节点之间的距离为1.树上每个节点i对应一个值k[i].每个点都有一个颜色,初始的时候所有点都是白色 ...

  7. 【UOJ139】【UER #4】被删除的黑白树(贪心)

    点此看题面 大致题意: 请你给一棵树黑白染色,使每一个叶结点到根节点的路径上黑节点个数相同. 贪心 显然,按照贪心的思想,我们要让叶结点到根节点的路径上黑节点的个数尽量大. 我们可以用\(Min_i\ ...

  8. 美团2017年CodeM大赛-初赛B轮-黑白树

    https://ac.nowcoder.com/acm/problem/13249 链接:https://ac.nowcoder.com/acm/problem/13249来源:牛客网 题目描述 一棵 ...

  9. 【uoj#139】[UER #4]被删除的黑白树 贪心

    题目描述 给出一个 $n$ 个节点的树,$1$ 号点为根.现要将其中一些点染成黑色,使得每个叶子节点(不包括根节点)到根节点路径上的黑点数相同.求最多能够染多少个黑点. 题解 贪心 显然有结论:选择的 ...

随机推荐

  1. JAVA学习之Ecplise IDE 使用技巧(1)第一章:我的地盘我做主,工作空间

    麦子学院/Andriod应用开发/第一阶段 Android 学前准备 第三课:Eclipse IDE 使用技巧 由马一鸣老师讲解.感谢麦子学院免费开放这部分视频资源. Eclipse由IBM开发的,2 ...

  2. het smooth 组装高杂合度二倍体基因组前期数据处理

    http://sourceforge.net/projects/het-smooth/ equencing technologies, such as Illumina sequencing, pro ...

  3. error: failed to initialize alpm library

    这个问题出在archlinux上面 [root@sarch pacman]# pacman -Syuerror: failed to initialize alpm library(database ...

  4. localhost 和 127.0.0.1 的区别

    很多人会接触到这个ip地址127.0.0.1.也许你会问127.0.0.1是什么地址?其实127.0.0.1是一个回送地址,指本地机,一般用来测试使用.大家常用来ping 127.0.0.1来看本地i ...

  5. 运动历史图(MHI)——Motion History Image

    MHI最初是由Bobick 和 Davis提出的,在此之前,Bobick 和 Davis 首先提出了二值的运动能量图(Motion Energy Image,MEI),通过描述物体如何移动和运动在空间 ...

  6. 357. Count Numbers with Unique Digits

    Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n. Examp ...

  7. SQL Server 合并表 union 和union all

    如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字.union(或称为联合)的作用是将多个结果合并在一起显示出来. union和unio ...

  8. ubuntu 14.04 apache maven 安装

    下载maven http://maven.apache.org/download.cgi  解压 tar -xzvf apache-maven-3.0.5-bin.tar.gz -C /usr/loc ...

  9. Hibernate--Enum类型的set集合映射到数据库(xml配置文件实现方式)

    使用enum 存储Permission的值 package demo; public enum Permission {    CREATE,DELETE,UPDATE;} Role与Permissi ...

  10. linux笔记_磁盘分区

    一.分区的意义 1.不同操作系统往往不可以同时装载在同一个分区,分区解决了不同操作系统装载在同一个物理硬盘的兼容性问题 2.机械硬盘盘片外圈读写速度相对内圈要快,分区可以把常用数据限制在读写速度较快的 ...