题目


分析

考虑从删除序列末尾来看,最大值一定在末尾,

然后与次大值之间夹了整条路径的点,降序以此类推

实际上从小到大是每个点到最大点的路径被打通的过程,由此分成若干条实链。

删除序列的位置实际上是到实链底端的距离加上其它实链底端小于该实链底端的实链总长度之和。

考虑维护每个点所处的实链底端的特征值(当变为最大值时,特征值发生改变),可以标记永久化

对于每一种实链用树状数组维护大小,每次修改新建特征值,换根即可。


代码

#include <cstdio>
#include <cctype>
#include <algorithm>
using namespace std;
const int N=200011; struct node{int y,next;}e[N<<1];
int c[N<<1],as[N],et=1,rk[N],n,ext,m,Q;
int iut(){
int ans=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans;
}
void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
void update(int x,int y){
for (;x<=m;x+=-x&x) c[x]+=y;
}
int query(int x){
int ans=0;
for (;x;x-=-x&x) ans+=c[x];
return ans;
}
struct Splay{
int son[N][2],stac[N],TOP,fat[N],siz[N]; bool rev[N];
bool unroot(int x){return son[fat[x]][0]==x||son[fat[x]][1]==x;}
bool Is_R(int x){return son[fat[x]][1]==x;}
void pup(int x){siz[x]=siz[son[x][0]]+siz[son[x][1]]+1;}
void Rev(int x){swap(son[x][0],son[x][1]),rev[x]^=1;}
void pdown(int x){
if (son[x][0]) rk[son[x][0]]=rk[x];
if (son[x][1]) rk[son[x][1]]=rk[x];
if (rev[x]){
if (son[x][0]) Rev(son[x][0]);
if (son[x][1]) Rev(son[x][1]);
rev[x]=0;
}
}
void rotate(int x){
int Fa=fat[x],FFa=fat[Fa],wh=Is_R(x),t=son[x][wh^1];
if (unroot(Fa)) son[FFa][Is_R(Fa)]=x;
son[x][wh^1]=Fa,son[Fa][wh]=t;
if (t) fat[t]=Fa; fat[Fa]=x,fat[x]=FFa;
pup(Fa),pup(x);
}
void splay(int x){
int y=x; stac[TOP=1]=y;
while (unroot(y)) stac[++TOP]=y=fat[y];
for (;TOP;--TOP) pdown(stac[TOP]);
for (;unroot(x);rotate(x)){
int Fa=fat[x];
if (unroot(Fa)) rotate((Is_R(x)^Is_R(Fa))?x:Fa);
}
}
void Access(int x){
int y=0;
for (;x;x=fat[y=x]){
splay(x);
update(rk[x],siz[son[x][1]]-siz[x]);
son[x][1]=y,pup(x);
}
update(ext,siz[y]);
}
void Make_root(int x){Access(x),splay(x),Rev(x),rk[x]=ext;}
}Tre;
void dfs(int x){
rk[x]=x;
for (int i=as[x];i;i=e[i].next)
if (e[i].y!=Tre.fat[x]){
Tre.fat[e[i].y]=x,dfs(e[i].y);
if (rk[x]<rk[e[i].y])
rk[x]=rk[e[i].y],Tre.son[x][1]=e[i].y;
}
Tre.siz[x]=Tre.siz[Tre.son[x][1]]+1;
}
int main(){
ext=n=iut(),Q=iut(),m=n+Q;
for (int i=1;i<n;++i){
int x=iut(),y=iut();
e[++et]=(node){y,as[x]},as[x]=et;
e[++et]=(node){x,as[y]},as[y]=et;
}
dfs(n);
for (int i=1;i<=n;++i) ++c[rk[i]];
for (int i=n;i;--i)
if (rk[i]==i) update(i,c[i]),c[i]>>=1;
for (int i=1;i<=Q;++i){
char ch=getchar();
while (!isalpha(ch)) ch=getchar();
if (ch=='u') ++ext,Tre.Make_root(iut());
else if (ch=='w'){
int x=iut(); Tre.splay(x);
print(query(rk[x])-Tre.siz[Tre.son[x][0]]);
putchar(10);
}else{
int x=iut(),y=iut(),sx,sy;
Tre.splay(x),sx=Tre.siz[Tre.son[x][1]];
Tre.splay(y),sy=Tre.siz[Tre.son[y][1]];
if (rk[x]!=rk[y]) print(rk[x]<rk[y]?x:y);
else print(sx<sy?x:y);
putchar(10);
}
}
return 0;
}

#LCT,树状数组#CF1137F Matches Are Not a Child's Play的更多相关文章

  1. [Codeforces1137F]Matches Are Not a Child's Play——LCT+树状数组

    题目链接: [Codeforces1137F]Matches Are Not a Child's Play 题目大意: 我们定义一棵树的删除序列为:每一次将树中编号最小的叶子删掉,将该节点编号加入到当 ...

  2. bzoj 3779 重组病毒 —— LCT+树状数组(区间修改+区间查询)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3779 RELEASE操作可以对应LCT的 access,RECENTER则是 makeroo ...

  3. 树状数组 Binary Indexed Tree/Fenwick Tree

    2018-03-25 17:29:29 树状数组是一个比较小众的数据结构,主要应用领域是快速的对mutable array进行区间求和. 对于一般的一维情况下的区间和问题,一般有以下两种解法: 1)D ...

  4. LOJ2831 JOISC2018 道路建设 LCT、树状数组

    传送门 题目的操作大概是:求某个点到根的链的逆序对,然后对这条链做区间赋值 求某个点到根的链,就是LCT中的access操作,所以我们每一次把access过后的链打上标记,就可以做到区间赋值了. 计算 ...

  5. hdu 6200 mustedge mustedge(并查集+树状数组 或者 LCT 缩点)

    hdu 6200 mustedge mustedge(并查集+树状数组 或者 LCT 缩点) 题意: 给一张无向连通图,有两种操作 1 u v 加一条边(u,v) 2 u v 计算u到v路径上桥的个数 ...

  6. 【bzoj3779】重组病毒 LCT+树上倍增+DFS序+树状数组区间修改区间查询

    题目描述 给出一棵n个节点的树,每一个节点开始有一个互不相同的颜色,初始根节点为1. 定义一次感染为:将指定的一个节点到根的链上的所有节点染成一种新的颜色,代价为这条链上不同颜色的数目. 现有m次操作 ...

  7. CF1137F Matches Are Not a Child's Play(LCT思维题)

    题目 CF1137F 很有意思的题目 做法 直接考虑带修改的做法,上一次最大值为u,这次修改v,则最大值为v了 我们发现:\(u-v\)这条链会留到最后,序列里的其他元素相对位置不变,这条链会\(u\ ...

  8. HDU4836 The Query on the Tree(树状数组&&LCA)

    由于智力的问题,百度之星完全lu不动..开场看第一题根据题目给的条件我觉得一定是可以构造出来的,题目给的意思颇有鸽巢原理的感觉,于是觉得开场第一题应该就是智力构造题了,想了半个小时,发现完全想不动,于 ...

  9. 【POJ 3167】Cow Patterns (KMP+树状数组)

    Cow Patterns Description A particular subgroup of K (1 <= K <= 25,000) of Farmer John's cows l ...

  10. Codeforces - 828E DNA Evolution —— 很多棵树状数组

    题目链接:http://codeforces.com/contest/828/problem/E E. DNA Evolution time limit per test 2 seconds memo ...

随机推荐

  1. TCP协议的流量控制和拥塞控制

    一开始,我总是容易把这2个概念搞混淆了,因此,为了加深理解,我写出来整理下思路. 一:流量控制 什么是流量控制,它涉及到哪些内容呢? 首先,我们看看一个最简单的tcp传输涉及到哪些东西 发送端,数据, ...

  2. Kotlin 协程五 —— 在Android 中使用 Kotlin 协程

    目录 一.Android MVVM 结构 二.添加依赖 三.在后台线程中执行 3.1 协程解决了什么问题 3.2 保证主线程安全 3.3 withContext 的性能 四.结构化并发 4.1 追踪协 ...

  3. Celery在Django项目中集成

    使用celery第一件要做的最为重要的事情是需要先创建一个Celery实例对象,我们一般叫做celery应用对象,或者更简单直接叫做一个app.app应用对象是我们使用celery所有功能的入口,比如 ...

  4. 【算法day3】小和、荷兰国旗、快排

    小和问题 现有数组[1,3,4,2,5] 1左边是0(小于1),所以1的小和为0 3左边是1(小于3),所以3的小和为1 4左边是1.3(均小于4),所以4的小和为1+3=4 2左边是1.3.4(只有 ...

  5. 无所不谈,百无禁忌,Win11本地部署无内容审查中文大语言模型CausalLM-14B

    目前流行的开源大语言模型大抵都会有内容审查机制,这并非是新鲜事,因为之前chat-gpt就曾经被"玩"坏过,如果没有内容审查,恶意用户可能通过精心设计的输入(prompt)来操纵L ...

  6. Java-- Arrays操纵数组的工具类

    1 //操作数组的工具类 java.util.Arrays :操作数组的工具类 里面定义了很多操作数组的方法 2 public static void main(String[] args) 3 { ...

  7. C# 课堂管理系统(火影忍者界面!!!)

    1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 usin ...

  8. 迈向现代化的.NET配置指北

    一.欢呼 .NET Standard 时代   我现在已不大提 .NET Core,对于我来说,未来的开发将是基于 .NET Standard,不仅仅是面向未来 ,也是面向过去:不只是 .NET Co ...

  9. XAF EFCore 示例

    前言 在DEV官方建议创建新的XAF项目推荐选择EFCore时,我也第一时间创建了XAF的EFCore项目,这也是我第一次创建这个类型的项目,之前一直使用XPO,避免不了要对比一下.如果熟悉XPO但不 ...

  10. 适用mybatis和jpa的全数据库类型主键生成插件,分布式高并发有序id生成器

    适用mybatis和jpa的全数据库类型主键生成插件,分布式高并发有序id生成器