CF1137F Matches Are Not a Child's Play(LCT思维题)
题目
CF1137F
很有意思的题目
做法
直接考虑带修改的做法,上一次最大值为u,这次修改v,则最大值为v了
我们发现:\(u-v\)这条链会留到最后,序列里的其他元素相对位置不变,这条链会\(u\longrightarrow v\)排到最后
序列会分成很多块,而这些块是以链为基础的
可以用\(LCT\)来做,具体说一下:
最大值放到根,修改v,就把\(v\)换成根,这个时候会拉一条链\(u-v\),此时\(u\)在\(v\)的右子树,\(x\)在单个块中的排序,就是\(LCT\)里单个\(splay\)比\(x\)大的数量\(+1\)
在\(splay\)外的个数,就是其他块的总和,每条链用一个时间轴\(tim\)记录,在换根的时候就会变化经过的每条链的大小
考虑带修前缀和,用树状数组维护
Code
#include<bits/stdc++.h>
typedef int LL;
const LL maxn=1e6+9;
void Dfs(LL u,LL f);
inline LL Read(){
LL x(0),f(1); char c=getchar();
while(c<'0' || c>'9'){
if(c=='-') f=-1; c=getchar();
}
while(c>='0' && c<='9'){
x=(x<<3)+(x<<1)+c-'0'; c=getchar();
}
return x*f;
}
struct node{
LL to,nxt;
}dis[maxn];
LL num,tim;
LL head[maxn];
inline void Add(LL u,LL v){
dis[++num]=(node){v,head[u]}; head[u]=num;
}
struct BIT{
LL up;
LL tree[maxn];
inline LL Lowbit(LL x){
return x&-x;
}
inline void Add(LL x,LL val){
for(x;x<=up;x+=Lowbit(x)) tree[x]+=val;
}
inline LL Query(LL x){
LL ret(0);
for(;x;x-=Lowbit(x)) ret+=tree[x];
return ret;
}
}t1;
struct LCT{
LL fa[maxn],son[maxn][2],size[maxn],lazy[maxn],r[maxn],col[maxn],sta[maxn];
inline LL N_rt(LL x){
return son[fa[x]][0]==x||son[fa[x]][1]==x;
}
inline void Up(LL x){
size[x]=size[son[x][0]]+size[son[x][1]]+1;
}
inline void Ro(LL x){
LL y(fa[x]),z(fa[y]),lz(son[y][1]==x);
if(N_rt(y)){
son[z][son[z][1]==y]=x;
}fa[x]=z;
son[y][lz]=son[x][lz^1]; if(son[y][lz]) fa[son[y][lz]]=y;
son[x][lz^1]=y; fa[y]=x;
Up(y); Up(x);
}
inline void Pr(LL x){
std::swap(son[x][0],son[x][1]); r[x]^=1;
}
inline void Pd(LL x){
LL lc(son[x][0]),rc(son[x][1]);
if(r[x]){
if(lc) Pr(lc);
if(rc) Pr(rc);
r[x]=0;
}
if(lazy[x]){
if(lc) col[lc]=lazy[lc]=lazy[x];
if(rc) col[rc]=lazy[rc]=lazy[x];
lazy[x]=0;
}
}
inline void Splay(LL x){
LL top(0),y(x); sta[++top]=y;
while(N_rt(y)) y=fa[y],sta[++top]=y;
while(top) Pd(sta[top--]);
while(N_rt(x)){
y=fa[x];
if(N_rt(y)){
LL z(fa[y]);
if((son[y][1]==x)^(son[z][1]==y)) Ro(x);else Ro(y);
}Ro(x);
}
}
inline void Ac(LL x,LL id){
LL y(0);
for(;x;y=x,x=fa[x]){
Splay(x); LL z(son[x][1]);
t1.Add(col[x],size[z]-size[x]);
son[x][1]=y;
Up(x);
}
t1.Add(id,size[y]); lazy[y]=id; col[y]=id;
}
inline void Mk_rt(LL x,LL id){
Ac(x,id); Splay(x); Pr(x);
}
inline LL Query(LL u){
Splay(u); LL ret(t1.Query(col[u]-1));
ret+=size[son[u][1]]+1;
return ret;
}
}t2;
LL n,m;
char s[maxn];
int main(){
n=Read(); m=Read();
for(LL i=1;i<n;++i){
LL u(Read()),v(Read());
Add(u,v); Add(v,u);
}
Dfs(1,0);
t1.up=(n<<1)+m;
for(LL i=1;i<=n;++i){
t2.col[i]=i; t2.size[i]=1;
t1.Add(i,1);
}
tim=n;
for(LL i=1;i<=n;++i)
t2.Mk_rt(i,++tim);
while(m--){
scanf(" %s",s+1); LL u,v;
if(s[1]=='u'){
u=Read();
t2.Mk_rt(u,++tim);
}else if(s[1]=='w'){
u=Read();
printf("%d\n",t2.Query(u));
}else{
u=Read(); v=Read();
printf("%d\n",t2.Query(u)<t2.Query(v)?u:v);
}
}
}
void Dfs(LL u,LL f){
for(LL i=head[u];i;i=dis[i].nxt){
LL v(dis[i].to); if(v==f) continue;
Dfs(v,u);
t2.fa[v]=u;
}
}
CF1137F Matches Are Not a Child's Play(LCT思维题)的更多相关文章
- [Codeforces1137F]Matches Are Not a Child's Play——LCT+树状数组
题目链接: [Codeforces1137F]Matches Are Not a Child's Play 题目大意: 我们定义一棵树的删除序列为:每一次将树中编号最小的叶子删掉,将该节点编号加入到当 ...
- CF1137F Matches Are Not a Child's Play(树链剖分)
题面 我们定义一棵树的删除序列为:每一次将树中编号最小的叶子删掉,将该节点编号加入到当前序列的最末端,最后只剩下一个节点时将该节点的编号加入到结尾. 例如对于上图中的树,它的删除序列为:2 4 3 1 ...
- 【树链剖分 ODT】cf1137F. Matches Are Not a Child's Play
孔爷的杂题系列:LCT清新题/ODT模板题 题目大意 定义一颗无根树的燃烧序列为:每次选取编号最小的叶子节点形成的序列. 要求支持操作:查询一个点$u$在燃烧序列中的排名:将一个点的编号变成最大 $n ...
- CF1137F Matches Are Not a Child's Play
我们定义一棵树的删除序列为:每一次将树中编号最小的叶子删掉,将该节点编号加入到当前序列的最末端,最后只剩下一个节点时将该节点的编号加入到结尾.现在给出一棵n个节点的树,有m次操作: up v:将v号节 ...
- [cf1137F]Matches Are Not a Child's Pla
显然compare操作可以通过两次when操作实现,以下仅考虑前两种操作 为了方便,将优先级最高的节点作为根,显然根最后才会被删除 接下来,不断找到剩下的节点中(包括根)优先级最高的节点,将其到其所在 ...
- Codeforces 1137F Matches Are Not a Child's Play [LCT]
Codeforces 很好,通过这题对LCT的理解又深了一层. 思路 (有人说这是套路题,然而我没有见过/kk) 首先发现,删点可以从根那里往下删,非常难受,所以把权值最大的点提为根. 然后考虑\(x ...
- Codeforces 1137F - Matches Are Not a Child's Play(LCT)
Codeforces 题面传送门 & 洛谷题面传送门 考虑将一个点 \(x\) 的编号变为当前所有点编号最大值 \(+1\) 会对每个点的删除时间产生怎么样的影响.由于编号最大的点肯定是最后一 ...
- LCT[Link-Cut-Tree学习笔记]
部分摘抄于 FlashHu candy99 所以文章篇幅较长 请有足够的耐心(不是 其实不用学好splay再学LCT的-/kk (至少现在我平衡树靠fhq) 如果学splay的话- 也许我菜吧-LCT ...
- 多校联训 DS 专题
CF1039D You Are Given a Tree 容易发现,当 \(k\) 不断增大时,答案不断减小,且 \(k\) 的答案不超过 \(\lfloor\frac {n}{k}\rfloor\) ...
随机推荐
- URL中?和#的区别(关于SSRF)以及mysql的secure-file-priv
零,绪论 20180125日,忙! 瞎比比总结一下,来满足这是个日记的样子. 1.今天谈的并不是什么技术[当然也不是没有技术(都很基础)]而是瞎几把扯. 一.关于一种SSRF的检测绕过: 1.背景: ...
- Objective-C代码学习大纲(1)
2011-05-11 14:06 佚名 otierney 字号:T | T 本文为台湾出版的<Objective-C学习大纲>的翻译文档,系统介绍了Objective-C代码,很多名词为台 ...
- Arduino开发版学习计划--蓝牙控制小车行走
蓝牙模块一共6个引脚,我们一般只需要接4个线就可以了,分别是VCC.GND.TXD.RXD这四个引脚,我们分别接到arduino板子上,VCC接3.3V,GND接板子的GND,蓝牙TXD接板子的RXD ...
- XML 配置里的 Bean 自动装配
在XML文件中,先看一下下面的代码: <bean id="student" class="com.jeremy.spring.beans.student" ...
- TabBar变透明
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent animated:YES];
- Power Strings----poj2406(kmp扩展 循环节)
题目链接:http://poj.org/problem?id=2406 题意:就是求串s能够最多由多少个相同的串a串联而成: 例如 ababab 由3个ab串联而成: abababa 只能由1个aba ...
- Win10新建文件不自动刷新
Win10 桌面创建文件/文件夹需要F5刷新才出来,资源管理器中创建也是一样的问题. 网上搜索的结果都以修改注册表,禁用音频面板检测,上述方案可能能解决部分情况. 实际上是桌面图标缓存出问题,以下是一 ...
- Apache Lucene初探
讲解之前,先来分享一些资料 首先,学习任何一门新的亦或是旧的开源技术,百度其中一二是最简单的办法,先了解其中的大概,思想等等.这里就贡献一个讲解很到位的ppt 这是Lucene4.0的官网文档:htt ...
- Java基础—注解(转载)
概念 注解(Annotation),也叫元数据.一种代码级别的说明.它是JDK1.5及以后版本引入的一个特性,与类.接口.枚举是在同一个层次.它可以声明在包.类.字段.方法.局部变量.方法参数等的前面 ...
- Shiro起步
1.测试环境 IntelliJ Idea 2.pom配置 <?xml version="1.0" encoding="UTF-8"?> <p ...