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

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

思路

可以树剖可以LCT,树剖就是每个重链开一个SET维护一下黑点的深度

非常不优美
使用LCT,在splay上二分找出需要的节点即可

代码

#include 
#include
#include
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

转载于:https://www.cnblogs.com/dreagonm/p/10768929.html

你可能感兴趣的文章
无法在web服务器上启动调试。调试失败,因为没有启用集成windows身份验证
查看>>
Bat相关的项目应用
查看>>
Django为数据库的ORM写测试例(TestCase)
查看>>
web.xml中的contextConfigLocation在spring中的作用
查看>>
NYOJ-107 A Famous ICPC Team
查看>>
与众不同 windows phone (44) - 8.0 位置和地图
查看>>
Visual Studio Code 使用 ESLint 增强代码风格检查
查看>>
iOS设备中的推送(二):证书
查看>>
敏捷 - #3 原则:经常提供工作软件 ( #3 Agile - Principle)
查看>>
数据结构与算法:二分查找
查看>>
使用思科模拟器Packet Tracer与GNS3配置IPv6隧道
查看>>
Linux设备驱动之Ioctl控制【转】
查看>>
iOS开发-NSPredicate
查看>>
《Clojure编程乐趣》—— 第1章,第1.2节为何(又一种)Lisp
查看>>
如何快速部署Node.js项目
查看>>
《移动App测试的22条军规》—App测试综合案例分析23.3节测试微信App的多任务和意外情况处理...
查看>>
《贝叶斯思维:统计建模的Python学习法》一1.6 M&M豆问题
查看>>
从代码层读懂HashMap的实现原理
查看>>
趋势在此汇集!2016杭州・云栖大会技术大咖专访系列合集
查看>>
Android应用框架之PackageManagerService
查看>>