NOIP太可怕了((( -口-)

题目链接

【题目大意】

给定一颗有根树(根为1),有以下两种操作:

1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记,其他结点均无标记,而且对于某个结点,可以打多次标记。)

2. 询问操作:询问某个结点最近的一个打了标记的祖先(这个结点本身也算自己的祖先)
 
【思路】
正着做不行就反方向来。先离线处理所有操作,算出最终某个点被标记了几次。跑一次dfs算出最终状态时每个点最近的打了标记的祖先u[i]。
从后往前重新看操作,如果是标记操作,那么当前节点标记数-1,如果标记数为0了,那么u[i]=fa[i]最近的祖先(用并查集来处理之前的更新)。如果为询问,则输出当前最近的祖先(同样可以用并查集来做)。
 #include<bits/stdc++.h>
using namespace std;
const int MAXN=+;
vector<int> E[MAXN];
int mark[MAXN];
int query[MAXN],ans[MAXN];
int u[MAXN],fa[MAXN],n,q;
char op[MAXN]; void dfs(int x,int anc,int father)
{
fa[x]=father;
if (mark[x]>) u[x]=x;
else u[x]=anc;
for (int i=;i<E[x].size();i++)
{
int to=E[x][i];
if (to==fa[x]) continue;
dfs(to,u[x],x);
}
} int union_set(int x)
{
int r=x;
while (u[r]!=r) r=u[r];
int now=x;
while (u[now]!=r)
{
int tmp=u[now];
u[now]=r;
now=tmp;
}
return u[x];
} void init()
{
scanf("%d%d",&n,&q);
for (int i=;i<n;i++)
{
int u,v;
scanf("%d%d",&u,&v);
E[u].push_back(v);
E[v].push_back(u);
}
mark[]=;
for (int i=;i<=q;i++)
{
char tmp[];
scanf("%s %d",tmp,&query[i]);
if (tmp[]=='C') mark[query[i]]++;
op[i]=tmp[];
}
dfs(,,);
for (int i=;i<=n;i++) cout<<u[i]<<endl;
} void solve()
{
memset(ans,,sizeof(ans));
for (int i=q;i>=;i--)
{
int now=query[i];
if (op[i]=='C')
{
mark[now]--;
if (!mark[now]) now=union_set(fa[now]);
}
else ans[++ans[]]=union_set(now);
}
for (int i=ans[];i>=;i--) printf("%d\n",ans[i]);
} int main()
{
init();
solve();
return ;
}

【并查集】BZOJ4551-[Tjoi2016&Heoi2016]树的更多相关文章

  1. [BZOJ4551][TJOI2016&&HEOI2016]树(并查集)

    4551: [Tjoi2016&Heoi2016]树 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1746  Solved: 800[Sub ...

  2. BZOJ4551 Tjoi2016&Heoi2016树(离线+并查集)

    似乎是弱化的qtree3.树剖什么的非常无脑.考虑离线.并查集维护每个点的最近打标记祖先,倒序处理,删除标记时将其与父亲合并即可. #include<iostream> #include& ...

  3. BZOJ4551——[Tjoi2016&Heoi2016]树

    1.题意: 给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记,其他结点均无标记,而且对于某个 结点,可以打多次标记.)2. 询问操作:询问某个 ...

  4. [bzoj4551][Tjoi2016][Heoi2016]树

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

  5. BZOJ4551: [Tjoi2016&Heoi2016]树

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

  6. [bzoj4551][Tjoi2016&Heoi2016]树-树链剖分

    Brief Description 给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记,其他结点均无标记,而且对于某个 结点,可以打多次标记.) ...

  7. BZOJ4551[Tjoi2016&Heoi2016]树——dfs序+线段树/树链剖分+线段树

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

  8. 【BZOJ4551】[Tjoi2016&Heoi2016]树 并查集

    [BZOJ4551][Tjoi2016&Heoi2016]树 Description 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下两 ...

  9. BZOJ 4551: [Tjoi2016&Heoi2016]树

    4551: [Tjoi2016&Heoi2016]树 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 748  Solved: 394[Subm ...

随机推荐

  1. Python的常用内置函数介绍

    Python的常用内置函数介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.取绝对值(abs) #!/usr/bin/env python #_*_coding:utf-8_ ...

  2. python---补充django中文报错(2),Django3.5出错

    今天是要Django3.5设置项目,结果出现中文报错,虽然之前分析过py2.7的报错原因,但是在py3之后reload不在使用,需要引入: from importlib import reload 但 ...

  3. 何凯文每日一句打卡||DAY13

  4. 使用 SP_OAXXX 创建文件夹,注意区别于 xp_cmdshell --mkdir xxx

    sp_configure 'show advanced options',1 go reconfigure with override go sp_configure 'Ole Automation ...

  5. 一个java版本的简单邮箱小爬虫

    //趁着有空回头复习了一把正则表达式/* 以下代码以百度某个贴吧的 URL 作为源,实现了读取 EmailAddress 并写入文件保存起来的两个功能,如果要爬取其它信息,可以改写正则实现相应功能 要 ...

  6. python中的 __repr__和__str__

    __repr__,被内置函数repr用于把一个对象用"官方"的字符串形式表示出来(终端友好)    1.值传给eval()来返回一个对象的字符串表示形式    2.否则返回一个尖括 ...

  7. 关于golang的defer的练习

    golang的defer怎么说.大意就是在函数return后.函数关闭前.按照filo的顺序来执行的关键字 上代码: package main import ( "fmt" ) f ...

  8. linux 串口驱动(三) 【转】

    转自:http://blog.chinaunix.net/uid-27717694-id-3495825.html 三.串口的打开在用户空间执行open操作的时候,就会执行uart_ops->o ...

  9. .net4.0切换2.0时,SplitContainer”的对象强制转换为类型

    问 题:将dotnet framework 4.0 切换到2.0时,编译没有问题,在运行时出现如下错误:System.InvalidCastException: 无法将类型为“System.Windo ...

  10. php常用的安全过滤函数

    目录结构 ①常用的安全函数有哪些: ②这些函数的作用: ③函数的用法: ④举例说明: ⑤参考资料: 由于越来越多的项目开始使用框架,所以,很多的程序员也不在关心安全的问题!因为框架已经帮我们几乎完美的 ...