P4116 Qtree3
思路
可以树剖可以LCT,树剖就是每个重链开一个SET维护一下黑点的深度
非常不优美
使用LCT,在splay上二分找出需要的节点即可
代码
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
struct Node{
int son[2],sum,inv,fa,val;
}SPT[100100];
int n,q;
bool isrl(int o){
return SPT[SPT[o].fa].son[1]==o;
}
bool isroot(int o){
return SPT[SPT[o].fa].son[0]!=o&&SPT[SPT[o].fa].son[1]!=o;
}
void pushup(int o){
SPT[o].sum=SPT[SPT[o].son[0]].sum+SPT[o].val+SPT[SPT[o].son[1]].sum;
}
void pushdown(int o){
if(SPT[o].inv){
SPT[SPT[o].son[0]].inv^=1;
SPT[SPT[o].son[1]].inv^=1;
swap(SPT[o].son[0],SPT[o].son[1]);
SPT[o].inv^=1;
}
}
void rorate(int o){
if(isroot(o))
return;
int f=SPT[o].fa;
int g=SPT[f].fa;
pushdown(f);
pushdown(o);
int which=isrl(o);
if(!isroot(f))
SPT[g].son[SPT[g].son[1]==f]=o;
SPT[o].fa=g;
SPT[f].son[which]=SPT[o].son[which^1];
SPT[SPT[o].son[which^1]].fa=f;
SPT[o].son[which^1]=f;
SPT[f].fa=o;
pushup(f);
pushup(o);
}
void allpush(int o){
if(!isroot(o))
allpush(SPT[o].fa);
pushdown(o);
}
void splay(int o){
allpush(o);
for(int f;!isroot(o);rorate(o)){
if(!isroot(f=SPT[o].fa))
rorate((isrl(f)==isrl(o))?f:o);
}
}
void access(int o){
for(int y=0;o;o=SPT[y=o].fa)
splay(o),SPT[o].son[1]=y,pushup(o);
}
void makeroot(int o){
access(o);
splay(o);
SPT[o].inv^=1;
pushdown(o);
}
int findroot(int o){
access(o);
splay(o);
pushdown(o);
while(SPT[o].son[0])
pushdown(o=SPT[o].son[0]);
return o;
}
void link(int x,int y){
makeroot(x);
if(findroot(y)!=x)
SPT[x].fa=y;
}
int dfs(int x){
if(SPT[x].val){
if(SPT[SPT[x].son[0]].sum)
return dfs(SPT[x].son[0]);
else
return x;
}
else{
if(SPT[SPT[x].son[0]].sum)
return dfs(SPT[x].son[0]);
else if(SPT[SPT[x].son[1]].sum)
return dfs(SPT[x].son[1]);
}
}
int query(int x){
access(x);
splay(x);
pushdown(x);
if(!(SPT[SPT[x].son[0]].sum+SPT[x].val))
return -1;
if(SPT[x].val&&(!SPT[SPT[x].son[0]].sum))
return x;
return dfs(SPT[x].son[0]);
}
int main(){
scanf("%d %d",&n,&q);
for(int i=1;i<n;i++){
int a,b;
scanf("%d %d",&a,&b);
link(a,b);
}
makeroot(1);
for(int i=1;i<=q;i++){
int opt,x;
scanf("%d %d",&opt,&x);
if(opt==0){
splay(x);
SPT[x].val^=1;
// pushup(x);
}
else{
printf("%d\n",query(x));
}
}
return 0;
}
P4116 Qtree3的更多相关文章
- [题解]luogu P4116 Qtree3
终于来到了Qtree3, 其实这是Qtree系列中最简单的一道题,并不需要线段树, 只要树链剖分的一点思想就吼了. 对于树链剖分剖出来的每一根重链,在重链上维护一个Set就好了, 每一个Set里存的都 ...
- 洛谷 P4116 Qtree3
Qtree系列第三题 我是题面 读完题大概不难判断是一道树剖的题 这道题的关键是记录两种状态,以及黑点的序号(不是编号) 线段树啊当然 定义两个变量v,f,v表示距离根节点最近的黑点,默认-1,f则表 ...
- 洛谷P4116 Qtree3
题目描述 给出\(N\)个点的一棵树(\(N-1\)条边),节点有白有黑,初始全为白 有两种操作: \(0\) \(i\) : 改变某点的颜色(原来是黑的变白,原来是白的变黑) \(1\) \(v\) ...
- 洛谷P4116 Qtree3(树剖+线段树)
传送门 LCT秒天秒地 树剖比较裸的题了 用线段树记录一下区间的最左边的黑点的编号(因为同一条链上肯定是最左边的深度最小,到根节点距离最近) 然后记得树剖的时候肯定是越后面的答案越优,因为深度越浅 / ...
- luogu P4116 Qtree3
题目描述 给出N个点的一棵树(N-1条边),节点有白有黑,初始全为白 有两种操作: 0 i : 改变某点的颜色(原来是黑的变白,原来是白的变黑) 1 v : 询问1到v的路径上的第一个黑点,若无,输出 ...
- 【洛谷 P4116】 Qtree3 (树链剖分)
题目链接 树剖练手题,想复习下树剖. 第一次提交\(T\)成QQC 看我 ??? 看了数据范围的确挺恶心的,我的复杂度是\(O(Mlog^2N)\)的,数据范围有三段 For 1/3 of the t ...
- 树链剖分【p4116】Qtree3 - Query on a tree
Description 给出N个点的一棵树(N-1条边),节点有白有黑,初始全为白 有两种操作: 0 i : 改变某点的颜色(原来是黑的变白,原来是白的变黑) 1 v : 询问1到v的路径上的第一个黑 ...
- 树链剖分&咕咕咕了好久好久的qtree3
前言 显然qtree系列都是树链剖分辣 发现自己没有专门整理过树链剖分耶 辣么就把这篇博客魔改成树链剖分好辣(貌似除了树剖也没什么好写的) 正文 废话了辣么多终于开始了 一.树剖怎么写鸭 二.树剖有什 ...
- Qtree3题解(树链剖分(伪)+线段树+set)
外话:最近洛谷加了好多好题啊...原题入口 这题好像是SPOJ的题,挺不错的.看没有题解还是来一篇... 题意: 很明显吧.. 题解: 我的做法十分的暴力:树链剖分(伪)+线段树+\(set\)... ...
随机推荐
- VS2017 SVN插件-AnkhSVN
AnkhSVN 该插件可以直接在vs017扩展和工具里安装,安装完成即可使用 默认VS自带的源码管理工具是GIT 如果已经使用需要手动切换到SVN:工具==>选项菜单中设置 SVN使用方法: 1 ...
- 免登陆下载jdk
linux下使用wget免登陆获取jdk对应版本gz包 wget --no-check-certificate --no-cookies --header "Cookie: oracleli ...
- PCL近邻搜索相关的类
首先PCL定义了搜索的基类pcl::search::Search<PointInT> template<typename PointT> class Search 其子类包括: ...
- 浅析对spring中IOC的理解
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
- 2018-2019-2 20175211 实验二《Java面向对象程序设计》实验报告
目录 代码托管 一.单元测试 (1)三种代码 二.TDD(Test Driven Development,测试驱动开发) 三.面对对象三要素 四.练习 五.问题及解决 六.PSP 代码托管 一.单元测 ...
- DDD领域驱动
DDD领域驱动领域驱动模型.模型驱动代码接触到需求第一步就是考虑领域模型,而不是将其切割成数据和行为,然后数据用数据库实现,行为使用服务实现,最后造成需求的首肢分离.DDD让你首先考虑的是业务语言而不 ...
- Sublime 个人配置
Sublime 个人配置 用的faltland主题,之后还加了一些自己喜欢的东西. 效果图如下: { "always_show_minimap_viewport": true, & ...
- git本地分支与远程分支
github上已经有master分支 和dev分支 在本地 git checkout -b dev 新建并切换到本地dev分支 git pull origin dev 本地分支与远程分支相关联 在本地 ...
- mysql杯观锁与乐观锁
悲观锁与乐观锁是两种常见的资源并发锁设计思路,也是并发编程中一个非常基础的概念.本文将对这两种常见的锁机制在数据库数据上的实现进行比较系统的介绍. 悲观锁(Pessimistic Lock) 悲观锁的 ...
- shunting-yard 调度场算法、中缀表达式转逆波兰表达式
中缀表达式 1*(2+3) 这就是一个中缀表达式,运算符在数字之间,计算机处理前缀表达式和后缀表达式比较容易,但处理中缀表达式却不太容易,因此,我们需要使用shunting-yard Algorith ...