http://www.lydsy.com/JudgeOnline/problem.php?id=4551

题目描述

给定一棵有根树(根为 1),有以下两种操作:
1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记,其他结点均无标记,而且对于某个结点,可以打多次标记。)
2. 询问操作:询问某个结点最近的一个打了标记的祖先(这个结点本身也算自己的祖先)。

输入格式

输入第一行两个正整数 分别表示节点个数和操作次数
接下来 行,每行两个正整数   表示 有一条有向边
接下来 行,“ ”时表示这是一个标记操作,为“ ”时表示这是一个询问操作,

输出格式

对于每一个询问操作,输出一个正整数,表示结果。

输入样例

5 5
1 2
1 3
2 4
2 5
Q 2
C 2
Q 2
Q 5
Q 3

输出样例

1
2
2
1

数据范围

题解

初始时打好所有标记,逆序处理,用并查集维护,当遇到一个询问操作时,把标记 ,若此时标记变为 ,则将该点与父亲节点合并。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#define N 1500005
#define depth 32
using namespace std;
int n,q,tot;
struct hh
{int to,next;}e[N<<1];
int fa[N],dep[N],col[N],last[N],f[N],opt[N],x[N],ans[N];
void add(int a,int b)
{e[++tot].to=b;e[tot].next=last[a];last[a]=tot;
}
void dfs(int now)
{int i;for(i=last[now];i;i=e[i].next)if(!dep[e[i].to]){dep[e[i].to]=dep[now]+1;fa[e[i].to]=now; dfs(e[i].to);}
}
int read()
{int ret=0;char c=getchar();while(!isdigit(c)) c=getchar();while(isdigit(c)){ret=(ret<<1)+(ret<<3)+c-'0';c=getchar();}return ret;
}
int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
int main()
{int i,j,u,v,fx,fy;char flag;n=read();q=read();for(i=1;i<=n-1;i++){u=read();v=read();add(u,v); add(v,u);}dfs(1);for(i=1;i<=q;i++){scanf("\n%c",&flag);if(flag=='C') opt[i]=1;else opt[i]=2;x[i]=read();}dep[1]=1;col[1]=1;for(i=1;i<=q;i++)if(opt[i]==1) col[x[i]]++;for(i=1;i<=n;i++) f[i]=i;for(i=2;i<=n;i++)if(!col[i]) f[find(i)]=find(fa[i]);for(i=q;i>=1;i--)if(opt[i]==2) ans[++ans[0]]=find(x[i]);else{col[x[i]]--;if(!col[x[i]]) f[find(x[i])]=find(fa[x[i]]);}for(i=ans[0];i>=1;i--)printf("%d\n",ans[i]);return 0;
}

转载于:https://www.cnblogs.com/yljiang/p/6034090.html

【BZOJ 4551】【TJOI2016】【HEOI2016】树相关推荐

  1. Luogu P1198 BZOJ 1012 最大数 (线段树)

    Luogu P1198 BZOJ 1012 最大数 (线段树) 手动博客搬家: 本文发表于20170821 14:32:05, 原地址https://blog.csdn.net/suncongbo/a ...

  2. BZOJ.4184.shallot(线段树分治 线性基)

    BZOJ 裸的线段树分治+线性基,就是跑的巨慢_(:з」∠)_ . 不知道他们都写的什么=-= //41652kb 11920ms #include <map> #include < ...

  3. [BZOJ 4551][Tjoi2016Heoi2016]树(并查集)

    Description 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标 ...

  4. BZOJ 4551树题解

    好吧,洛谷的数据比较水暴力就可以过....(而且跑到飞快) 不过(BZ水不过去)还是讲讲正规的做法. 其实一眼可以看出可以树剖,但是,码起来有点麻烦. 其实有一种更简单的离线做法. 我们很容易联想到并 ...

  5. bzoj 4551: [Tjoi2016Heoi2016]树【并查集】

    看起来像是并查集,但是是拆集合,考虑时间倒流,先把标记都打上,然后把并查集做出来 每次到一个修改点就把这个点的计数s[u]--,当这个s为0时就把这个点和他的父亲合并(因为可能有多次标记) #incl ...

  6. bzoj 4551[Tjoi2016Heoi2016]树

    这题可以用并查集做,一开始统计一下记录每个点被标记了几次,除了被标记过的点外,其他节点都与其父亲所在集合合并,然后倒着做,做的时候如果有节点标记次数变为了0,则将其与其父亲合并. 代码 1 #incl ...

  7. bzoj 4871: [Shoi2017]摧毁“树状图”

    4871: [Shoi2017]摧毁"树状图" Time Limit: 25 Sec  Memory Limit: 512 MB Submit: 53  Solved: 9 [Su ...

  8. BZOJ 2243 染色(树链剖分好题)

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 7971  Solved: 2990 [Submit][Stat ...

  9. bzoj 4025 二分图——线段树分治+LCT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4025 线段树分治,用 LCT 维护链的长度即可.不过很慢. 正常(更快)的方法应该是线段树分 ...

  10. [TJOI2016][HEOI2016]排序

    题目大意: 给定一个$1\sim n(n\leq10^5)$的全排列,有$m(m\leq10^5)$次操作,每次把区间$[l,r]$按照升序或降序排序.最后询问所有操作完成后,位置为$q$的数是多少. ...

最新文章

  1. java me sdk_Java ME SDK 3.0不运行的问题及解决
  2. 实验进行中:.NET WebAssembly支持
  3. MATLAB报错“Integers can only be raised to positive integral powers.“
  4. 秀尔算法:破解RSA加密的“不灭神话” --zz
  5. Aizu 0525 Osenbei(状压+贪心)
  6. 网页获取服务器时间,通过AFNetworking获取服务器时间
  7. bootstrap signin将邮件改成用户名_了解电子邮件传递背后的流程
  8. MyEclipse8.5默认工作区间修改
  9. 如果一个国家是一种颜色,中国的颜色美哭了!
  10. wiki——Isogeometric_analysis
  11. CYQ.Data 正式支持 DotNET Core 版本发布
  12. android+开发平板应用,Android平板应用开发教程
  13. 1到20的阶乘和是多少 php,20的阶乘(1到20的阶乘和结果)
  14. 自动布局神器 -- ZXPAutoLayout框架的使用
  15. C语言练习①一英寸是多少厘米?
  16. 你有必要不沾计算机一段时间英语,八年级英语下册unit 1必背词组及句子(新人教版).docx...
  17. https配置CA证书安装教程
  18. PyCharm配置Virtual Environment
  19. 方向传感器新的替代方法详解
  20. 开关电源模块 遥控开/关电路

热门文章

  1. Linux Ubuntu/Centos7 定时备份mysql数据库
  2. IDEA 常用设置 与 常用操作(三)
  3. Redis 分布式客户端 Redisson 分布式锁快速入门
  4. Thymeleaf-extras-Spring Security 权限控制
  5. Windows 安装 Oracle Java JDK
  6. 封装条形码MaHelper
  7. mac下git安装与使用
  8. 在容器服务kubernetes上配置https
  9. 音视频重新封装的流程
  10. 错题分析--ASP.NET