正题

题目链接:https://www.luogu.com.cn/problem/CF1137F


题目大意

给出nnn个点的一棵树,第iii个点权值为iii。

一棵树的删除序列定义为每次删除编号最小的叶子并将其加入序列末尾。

要求支持

  1. 修改一个点的权值为一个比目前所有权值都要大的一个值
  2. 询问一个点在删除序列的位置
  3. 询问两个点在删除序列的先后顺序

1≤n,q≤2×1051\leq n,q\leq 2\times 10^51≤n,q≤2×105


解题思路

假设我们已经确定的先后顺序,目前最大的权值为yyy号点,然后修改一个点xxx时相当于把y∼xy\sim xy∼x的路径上所有点依次放在序列末尾。

相当于我们要支持提出一条树链,可以考虑用LCTLCTLCT实现。

以权值最大的点为根,我们对于每一条树链(splay)附上同一个颜色,那么一个点的答案就是颜色编号比它小的点数+所在树链上深度比它小的点数+1。

然后修改就相当于连接+换根+换颜色。颜色方面可以用树状数组维护前缀和,然后再AccessAccessAccess的时候进行修改,换根也是可以用LCTLCTLCT做到的。

时间复杂度O(nlog⁡2n)O(n\log^2 n)O(nlog2n)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
#define lowbit(x) (x&-x)
using namespace std;
const int N=2e5+10;
struct node{int to,next;
}a[N<<1];
int n,q,cnt,tot,ls[N],col[N];
struct BinaryInTree{int t[N<<1],n;void Change(int x,int val){while(x<=n){t[x]+=val;x+=lowbit(x);}return;}int Ask(int x){int ans=0;while(x){ans+=t[x];x-=lowbit(x);}return ans;}
}B;
struct LCT{int fa[N],t[N][2],siz[N];bool r[N];stack<int> s;bool Nroot(int x){return fa[x]&&(t[fa[x]][0]==x||t[fa[x]][1]==x);}bool Direct(int x){return t[fa[x]][1]==x;}void PushUp(int x){siz[x]=siz[t[x][0]]+siz[t[x][1]]+1;return;}void Rev(int x){r[x]^=1;swap(t[x][0],t[x][1]);return;}void PushDown(int x){if(t[x][0])col[t[x][0]]=col[x];if(t[x][1])col[t[x][1]]=col[x];if(!r[x])return;Rev(t[x][0]);Rev(t[x][1]);r[x]=0;return;}void Rotate(int x){int y=fa[x],z=fa[y];int xs=Direct(x),ys=Direct(y);int w=t[x][xs^1];if(Nroot(y))t[z][ys]=x;t[y][xs]=w;t[x][xs^1]=y;if(w)fa[w]=y;fa[y]=x;fa[x]=z;PushUp(y);PushUp(x);return;}void Splay(int x){int y=x;s.push(x);while(Nroot(y))y=fa[y],s.push(y);while(!s.empty())PushDown(s.top()),s.pop();while(Nroot(x)){int y=fa[x];if(!Nroot(y))Rotate(x);else if(Direct(x)==Direct(y))Rotate(y),Rotate(x);else Rotate(x),Rotate(x);}return;}void Access(int x){for(int y=0;x;y=x,x=fa[x]){Splay(x);t[x][1]=0;PushUp(x);B.Change(col[x],-siz[x]);B.Change(cnt,siz[x]);t[x][1]=y;PushUp(x);}return;}void MakeRoot(int x){++cnt;Access(x);Splay(x);col[x]=cnt;Rev(x);return;}int Ask(int x){Splay(x);return siz[t[x][1]]+1+B.Ask(col[x]-1);}
}T;
void addl(int x,int y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;return;
}
void dfs(int x){col[x]=x;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==T.fa[x])continue;T.fa[y]=x;dfs(y);if(col[y]>col[x]){col[x]=col[y];T.t[x][1]=y;}}B.Change(col[x],1);T.PushUp(x);
}
int main()
{scanf("%d%d",&n,&q);for(int i=1;i<n;i++){int x,y;scanf("%d%d",&x,&y);addl(x,y);addl(y,x);}B.n=n+q;cnt=n;dfs(n);for(int i=1;i<=q;i++){char op[6];int x,y;scanf("%s%d",op,&x);if(op[0]=='u')T.MakeRoot(x);else if(op[0]=='w')printf("%d\n",T.Ask(x));else if(op[0]=='c'){scanf("%d",&y);int l=T.Ask(x),r=T.Ask(y);if(l<r)printf("%d\n",x);else printf("%d\n",y);}}return 0;
}

CF1137F-Matches Are Not a Child‘s Play【LCT】相关推荐

  1. 【LCT】【树状数组】Matches Are Not a Child‘s Play(luogu CF1137F)

    正题 luogu CF1137F 题目大意 定义一棵树的产出序列为依次删除权值最小的叶子节点的顺序 进行q此操作: 1.把一个点的权值改为当前树中的最大权值+1 2.查询一个点在删除序列中的位置 3. ...

  2. CF1137F Matches Are Not a Child‘s Play(树上数据结构问题、树链剖分+ODT)

    Description 一棵 n 个点的树,点权最初为 1 ∼ n 的排列. 定义一个删点过程:每次找到权值最小的叶子,删去它以及连接的边,重复这个过程直到剩下一个点,然后删去最后的点. 处理 q 个 ...

  3. 【转】Silverlight 3 Beta 新特性解析(7)- Child Window和Shader Effect篇

    前提条件: 阅读本文之前请确认你已经安装了如下软件 Visual Studio 2008 (Express) SP1 Silverlight 3 Tools For Visual Studio Mic ...

  4. 【Android】No resource found that matches the given name 'Theme.Sherlock.Light.NoActionBar'

    被这个问题困扰了好久-- 错误如下: error: Error retrieving parent for item: No resource found that matches the given ...

  5. 【CSS3】Advanced3:Universal, Child, and Adjacent Selectors

    1.Universal selectors eg:#target*{ } 2.Child selectors < something immediately nested within some ...

  6. tomcat服务器出现【A child container failed during start】问题解决

    启动Java Web项目时,发现tomcat无法启动,并IDEA弹出错误提示,localhost tomcat is faild之类的 再看控制台的输出信息,发现几个严重错误,本着 最先解决 第一个问 ...

  7. 【React】React.Children.only expected to receive a single React element child

    背景: React  项目使用Ant Design + Storybook时发报: Uncaught Error: React.Children.only expected to receive a ...

  8. 【翻译】西川善司《伊甸之子》(Child of Eden)讲座前篇

    http://www.opengpu.org/forum.php?mod=viewthread&tid=7568&extra=page%3D1 游戏介绍 育碧于2011年10月06日公 ...

  9. CF438E-The Child and Binary Tree【生成函数】

    正题 题目链接:https://www.luogu.com.cn/problem/CF438E 题目大意 每个节点有nnn个权值可以选择,对于1∼m1\sim m1∼m中的每个数字kkk,求权值和为k ...

最新文章

  1. C/C++之动态分配内存
  2. 查找计算机视觉、模式识别、图像处理领域的国际会议和会议排名
  3. MSEG和EKBE的区别在哪里
  4. C++之面向对象模型
  5. SAP License:FI学习笔记
  6. 任意目录下启动tomcat
  7. Taskonomy: Disentangling Task Transfer Learning程序运行记录
  8. Why hash maps in Java 8 use binary tree instead of linked list?
  9. 微信自动选择浏览器打开方式
  10. 单独得省级行政区数据
  11. redis进阶之bigkey和hotkey
  12. 罗技F710 无线手柄在ROS下的配置使用总结
  13. android屏幕大小字体大小,Android字体大小自适应不同分辨率的解决办法
  14. 北大青鸟消防控制器组网_北大青鸟消防报警主机维修与调试
  15. JVAV SE学习总结(01)
  16. oracle数据库怎么进行树查询,oracle树查询的实现
  17. JDK19都出来了~是时候梳理清楚JDK的各个版本的特性了【JDK16特性讲解】
  18. c语言hypot函数,hypot_数值 | Numerics_C_参考手册_非常教程
  19. LabVIEW入门第六天(布尔控件及布尔量)
  20. 史上最简单的 MySQL 教程

热门文章

  1. 是否显示展开_Creo7.0教程之绝对精度对钣金件展开的作用详解
  2. rocketmq 顺序消费_10 分钟看懂消息队列 RocketMQ
  3. 重力模型matlab代码,STK基础教程.doc
  4. 线性跟驰模型 matlab,Bierley非线性跟驰模型特性仿真分析
  5. linux快速切换目录命令,Linux在命令行快速切换目录 - 米扑博客
  6. 只能选择分卷文件的第一部分。_为机器学习模型选择正确的度量评估(第一部分)...
  7. 查询程序崩溃日志_PC 崩溃报告途径 amp; 临时解决方法
  8. html下拉菜单的子目录,html - 带有下拉菜单的子菜单的垂直下拉菜单 - 堆栈内存溢出...
  9. Java如何控制用户输入的长度,用Java Applet 进行Web编程时,如何限制输入域中可输入字符的长度!解决后马上给分!!!...
  10. 新增一个主键自增长_MyBatis 示例-主键回填