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: 黑白树的更多相关文章
-
【BZOJ3319】黑白树 并查集
[BZOJ3319]黑白树 Description 给定一棵树,边的颜色为黑或白,初始时全部为白色.维护两个操作:1.查询u到根路径上的第一条黑色边的标号.2.将u到v 路径上的所有边的颜色设为 ...
-
【BZOJ】3319: 黑白树
http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...
-
【BZOJ】3319: 黑白树(并查集+特殊的技巧/-树链剖分+线段树)
http://www.lydsy.com/JudgeOnline/problem.php?id=3319 以为是模板题就复习了下hld............................. 然后n ...
-
uoj #139. 【UER #4】被删除的黑白树 dfs序 贪心
#139. [UER #4]被删除的黑白树 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/139 Descript ...
-
[BZOJ 3319] 黑白树
3319: 黑白树 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 557 Solved: 194[Submit][Status][Discuss] ...
-
CodeM美团点评编程大赛初赛B轮 黑白树【DFS深搜+暴力】
[编程题] 黑白树 时间限制:1秒 空间限制:32768K 一棵n个点的有根树,1号点为根,相邻的两个节点之间的距离为1.树上每个节点i对应一个值k[i].每个点都有一个颜色,初始的时候所有点都是白色 ...
-
【UOJ139】【UER #4】被删除的黑白树(贪心)
点此看题面 大致题意: 请你给一棵树黑白染色,使每一个叶结点到根节点的路径上黑节点个数相同. 贪心 显然,按照贪心的思想,我们要让叶结点到根节点的路径上黑节点的个数尽量大. 我们可以用\(Min_i\ ...
-
美团2017年CodeM大赛-初赛B轮-黑白树
https://ac.nowcoder.com/acm/problem/13249 链接:https://ac.nowcoder.com/acm/problem/13249来源:牛客网 题目描述 一棵 ...
-
【uoj#139】[UER #4]被删除的黑白树 贪心
题目描述 给出一个 $n$ 个节点的树,$1$ 号点为根.现要将其中一些点染成黑色,使得每个叶子节点(不包括根节点)到根节点路径上的黑点数相同.求最多能够染多少个黑点. 题解 贪心 显然有结论:选择的 ...
随机推荐
-
【XLL 框架库函数】 TempActiveCell/TempActiveCell12
这两个函数创建 XLOPER/XLOPER12 ,包含了当前激活工作表上的单元格引用. LPXLOPER TempActiveCell(WORD row, BYTE col); LPXLOPER12 ...
-
C++中构造函数详解及显式调用构造函数
C++构造函数详解及显式调用构造函数 c++类的构造函数详解 一. 构造函 ...
-
poj 2104 K-th Number 划分树,主席树讲解
K-th Number Input The first line of the input file contains n --- the size of the array, and m --- t ...
-
mysql 执行计划走索引
<pre name="code" class="html">mysql> desc AssignClientManager; +------- ...
-
UNIX网络编程——带外数据
许多传输层有带外数据的概念,它有时也称为经加速数据.其想法是一个连接的某端发生了重要的事情,而且该端希望迅速通告其对端.这里"迅速"意味着这种通知应该在已排队等待发送的任何&quo ...
-
nginx简单使用配置
使用nginx首先要明确使用场景,这里是一台服务器实现多种类型访问:网站首页访问,GitLab访问,note(私人springboot项目),静态文件访问. 下面是一份配置文件 nginx.conf, ...
-
构建squid代理服务器
基本概念 本文使用squid代理服务 软件介绍:百度百科 作为应用层的代理服务软件,Squid主要提供缓存加速.应用层过滤控制的功能: 工作机制:缓存网页对象,减少重复请求(HTTP代理的缓存加速对象 ...
-
codevs 1423 骑士 - Tarjan - 动态规划
题目描述 Description Z国的骑士团是一个很有*的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵 ...
-
spring boot 资料
http://412887952-qq-com.iteye.com/blog/2344171 http://study.163.com/course/courseMain.htm?courseId=1 ...
-
AngularJs几种服务区别
下面说说这几种函数之间的区别: 函数 定义 适合场景 provider(name, Object OR constructor() ) 一个可配置的.有复杂逻辑的服务.如果你传递了一个对象,那么它应该 ...