题目


分析

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

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

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

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

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

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


代码

#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. win32-Transparent的使用

    这个api的功能主要是实现"透明" 原理: Transparent将hdc中bmp的特定颜色"透明化" #include <Windows.h> # ...

  2. 硬件开发笔记(十一):Altium Designer软件介绍、安装过程和打开pcb工程测试

    前言   前面做高速电路,选择是阿li狗,外围电路由于读者熟悉AD,使用使用ad比较顺手,非高速电路就使用AD了,其实AD也可以做高速电路,由于笔者从13年开始做硬是从AD9开始的,所以开始切入AD做 ...

  3. locals和globals,函数的嵌套,nonlocal,闭包函数及特点以及匿名函数---day11

    1.locals和globals 1.1locals  获取当前作用域中的所有内容 locals 如果在函数外,调用locals(),获取打印的是打印之前的所有变量,返回字典,全局空间作用域 loca ...

  4. git开发流程图解,本地分支合并,并推送远程分支步骤

    本地分支合并,并推送远程分支步骤 1.只有当将修改内容commit后 该修改才完全生效,进行merge前需要将两个分支修改的内容都进行commit 2.假设本地两个分支 用于开发的分支:dev 用于同 ...

  5. django中的一些装饰器用法

    1.require_http_methods() 1.要求视图只接受特定的请求方法 2.该装饰器允许传递多个请求方法参数,以列表的形式,请求方法名要大写 from django.views.decor ...

  6. error: RPC failed; curl 92 HTTP/2 stream 0 was not closed cleanly: PROTOCOL_ERROR (err 1)

    起因:自己顶不住好奇心,升级了Mac系统.界面看起来,真香!然鹅用起来其实也挺香,就是有些开发常用的竟然挂掉了,挂掉了. 最直观的就是Parallels Desktop , xcode , git,完 ...

  7. 【Azure Function】Azure Function中使用 Java 8 的安全性问题

    问题描述 使用Azure Function, 环境是Linux的Java8.目前 Oracle Java JDK8,11,17 和 OpenJDK 8/11/17 都在存在漏洞受影响版本的范围内. O ...

  8. 【Azure 应用服务】在Azure App Service for Linux环境中,部署的Django应用,出现加载css、js等静态资源文件失败

    问题描述 在App Service for Linux环境中,部署Django应用,访问应用页面时候,出现css.js等静态资源文件加载失败问题. 浏览器Console提示的错误消息为: Refuse ...

  9. 关于Java并发多线程的一点思考

    写在开头 在过去的2023年双11活动中,天猫的累计访问人次达到了8亿,京东超60个品牌销售破10亿,直播观看人数3.0亿人次,订单支付频率1分钟之内可达百万级峰值,这样的瞬间高并发活动,给服务端带来 ...

  10. Zabbix MQQT协议监控 loT设备

    一. 项目背景 监控异地局域网主机(主机内有物联5G卡 可以单方面向特定的云服务器传输信息)这里采用 zabbix 5xx系列 agent2 -6.2 版本 主动模式,即客户端向服务端注册.   二. ...