博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
luogu P4116 Qtree3
阅读量:6329 次
发布时间:2019-06-22

本文共 1277 字,大约阅读时间需要 4 分钟。

题目描述

给出N个点的一棵树(N-1条边),节点有白有黑,初始全为白

有两种操作:

0 i : 改变某点的颜色(原来是黑的变白,原来是白的变黑)

1 v : 询问1到v的路径上的第一个黑点,若无,输出-1

输入格式

第一行 N,Q,表示N个点和Q个操作

第二行到第N行N-1条无向边

再之后Q行,每行一个操作"0 i" 或者"1 v" (1 ≤ i, v ≤ N).

输出格式

对每个1 v操作输出结果


考虑只对于一条到根的路径的情况:

如果给路径加了一个黑点,那么有两种情况:一是这个黑点深度不是最小的,那么我们不用管它;二是这个黑点是深度最小的黑点,那么我们需要对这条路径的信息进行更新。如果给路径删了一个黑点的话类似。

所以对于一条路径的情况,我们需要一个支持维护最小值、加入和删除点的数据结构。那么堆可以胜任。

那么考虑完整的树的情况:

不难想到对于每个点到根节点的路径都维护一个堆,那么一共要维护N个堆,每次修改最多改N个点的信息(树为一条链,修改根节点)。复杂度显然是我们不能接受的。

由于树链剖分之后每一条路径都可以表示成几个链子拼起来的形式,所以我们可以对原树进行重链剖分。然后我们只需要对于每条链子都维护一个堆即可。

时间复杂度为O(NlogNlogN)

#include
#include
#include
#include
#define maxn 100001#define maxm 300001using namespace std;int n,m;bool col[maxn];inline int read(){ register int x(0),f(1); register char c(getchar()); while(c<'0'||'9'
size[son[u]]) son[u]=v; }}void dfs_rewrite(int u,int tp){ dfn[u]=++tot,id[tot]=u,top[u]=tp; if(son[u]) dfs_rewrite(son[u],tp); for(register int i=head[u];~i;i=e[i].next){ int v=e[i].to; if(v!=fa[u]&&v!=son[u]) dfs_rewrite(v,v); }}set
ans[maxn];int main(){ memset(head,-1,sizeof head); n=read(),m=read(); for(register int i=1;i

转载于:https://www.cnblogs.com/akura/p/11066699.html

你可能感兴趣的文章
iOS开发性能优化的25个tips
查看>>
AP do not regist to WLC
查看>>
keepalived打造mysql主主高可用
查看>>
Maven学习总结(七)——eclipse中使用Maven创建Web项目
查看>>
SVN学习总结(2)——SVN冲突解决
查看>>
BZOJ1001[BeiJing2006]狼抓兔子——最小割
查看>>
linux文件查找命令使用总结
查看>>
时空查询里分线查询
查看>>
初探莫比乌斯反演及欧拉反演
查看>>
Windows phone 应用开发[14]-调用WebBrowser
查看>>
ubuntu中Samba服务之配置
查看>>
【putty】putty network error software caused connection abort
查看>>
python 中的三元运算符
查看>>
swiper的基础使用(十四)
查看>>
AVComposition
查看>>
64位Ubuntu安装适配32位程序的库
查看>>
HTML5结构
查看>>
Openstack swift+keystone+glance安装总结
查看>>
mysql字符集
查看>>
如何管理网站后台
查看>>