关闭

bzoj 4551: [Tjoi2016&Heoi2016]树 并查集

252人阅读 评论(0) 收藏 举报
分类:

题意:有一棵树,一开始根节点是黑色的,其余节点都是白色的。要求资瓷两个操作:

给某个节点变成黑色

查询离某个节点最近的祖先


分析:一开始往各种数据结构和神奇的算法上面去想但都没卵用,也想过离线,但感觉貌似不行就pass了。结果正解真的是离线搞……

以后有想法后一定要仔细想清楚是否能行。

正解其实就是从后往前搞然后用并查集维护一下就好了。

一次AC不解释


代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define N 100005
using namespace std;

int n,m,f[N],fa[N],ans[N],x[N],last[N],cnt,tag[N];
char ch[N][2];
struct edge{int to,next;}e[N*2];

void insert(int u,int v)
{
	e[++cnt].to=v;e[cnt].next=last[u];last[u]=cnt;
	e[++cnt].to=u;e[cnt].next=last[v];last[v]=cnt;
}

int find(int x)
{
	if (f[x]==x) return x;
	f[x]=find(f[x]);
	return f[x];
}

void dfs(int x,int p)
{
	if (x!=p) f[find(x)]=find(p);
	for (int i=last[x];i;i=e[i].next)
	{
		if (e[i].to==fa[x]) continue;
		fa[e[i].to]=x;
		if (tag[e[i].to]) dfs(e[i].to,e[i].to);
		else dfs(e[i].to,p);
	}
}

int main()
{
	scanf("%d%d",&n,&m);
	for (int i=1;i<n;i++)
	{
		int u,v;
		scanf("%d%d",&u,&v);
		insert(u,v);
	}
	tag[1]++;
	for (int i=1;i<=m;i++)
	{
		scanf("%s%d",&ch[i],&x[i]);
		if (ch[i][0]=='C') tag[x[i]]++;
	}
	for (int i=1;i<=n;i++)
		f[i]=i;
	dfs(1,1);
	for (int i=m;i>=1;i--)
		if (ch[i][0]=='C')
		{
			tag[x[i]]--;
			if (!tag[x[i]]) f[find(x[i])]=find(fa[x[i]]);
		}
		else ans[i]=find(x[i]);
	for (int i=1;i<=m;i++)
		if (ch[i][0]=='Q') printf("%d\n",ans[i]);
	return 0;
}


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

bzoj2733 永无乡 线段树合并

这道题是一道经典的平衡树+启发式合并吧。那么考虑用可持久化线段树来写。        对每一个节点保存一棵线段树表示所在块的编号的集合(因此可以一个块值保存一棵树),然后合并的时候就地柜合并左子节点和...
  • lych_cys
  • lych_cys
  • 2016-03-10 21:32
  • 1279

【bzoj4551】[Tjoi2016&Heoi2016]树 暴力?树剖+树状数组+二分

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

可持久性数组 bzoj3674 可持久化并查集加强版

传送门:点击打开链接 题意: 强制在线操作,定义3种操作,查询两个点是否在同一集合,合并两个点,把状态恢复到之前的某个状态 思路:利用线段树实现的可持久性数组,其实原理上就是线段树,那么是如何实现...
  • qwb492859377
  • qwb492859377
  • 2016-01-03 19:38
  • 1656

BZOJ 4551 HEOI 2016 树 (并查集)

思路: 考虑时光倒流 这不就是并查集裸题了…………….//By SiriusRen #include #include #include using namespace std; #defi...
  • qq_31785871
  • qq_31785871
  • 2017-01-02 14:56
  • 495

bzoj-4551 [Tjoi2016&Heoi2016]树

题意: 给出一棵树,有两种操作: C x:标记点x; Q x:查询某个点的最近被标记祖先; n,m 题解: 首先我们发现如果标记了一个点,其影响是对于个子树,也就是一段DFS区间的...
  • ww140142
  • ww140142
  • 2016-05-10 22:24
  • 795

bzoj4551【TJOI2016&HEOI2016】树

DFS序+线段树/并查集
  • AaronGZK
  • AaronGZK
  • 2016-06-14 00:27
  • 1494

bzoj4551 [Tjoi2016&Heoi2016]树 树链剖分+树状数组+二分答案

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

BZOJ4551——[Tjoi2016&Heoi2016]树

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

BZOJ 4551 [Tjoi2016&Heoi2016]树

本次省选最水的题,暴力可过。 正解可以用树链剖分,或者直接并查集找爸爸就行了。 bzoj 上只能用树链剖分。#include  #include  #include  #include  ...
  • magic_sheep
  • magic_sheep
  • 2017-02-25 21:32
  • 86

bzoj4551 [Tjoi2016&Heoi2016]树

Description在2016年,佳媛姐姐刚刚学习了树,非常开心。现在他想解决这样一个问题:给定一颗有根树(根为1),有以下两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记,...
  • SLYZ_wumingshi
  • SLYZ_wumingshi
  • 2017-03-29 08:18
  • 169
    个人资料
    • 访问:203826次
    • 积分:9516
    • 等级:
    • 排名:第2118名
    • 原创:835篇
    • 转载:3篇
    • 译文:0篇
    • 评论:36条
    欢迎qq交流
    qq:763647200
    文章分类
    最新评论