http://www.lydsy.com/JudgeOnline/problem.php?id=4817

lct+线段树+dfs序

操作1:access

操作2:u到根的-v到根的-lca到根的*2+1

操作3:查询线段树区间最大值

1A,嘎嘎嘎

#include<cmath>
#include<cstdio>
#include<iostream> using namespace std; #define max(x,y) ((x)>(y) ? (x) : (y)) #define N 100001 int n;
int front[N],to[N<<],nxt[N<<],tot; int id[N],dy[N],lst[N],tim;
int dep[N]; int lim,F[N][]; int mx[N<<],tag[N<<]; int root;
int fa[N],ch[N][];
bool rev[N]; int st[N],top; int ans; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} void add(int u,int v)
{
to[++tot]=v; nxt[tot]=front[u]; front[u]=tot;
to[++tot]=u; nxt[tot]=front[v]; front[v]=tot;
} void dfs(int x)
{
id[x]=++tim;
dy[tim]=x;
dep[x]=dep[fa[x]]+;
for(int i=front[x];i;i=nxt[i])
if(to[i]!=fa[x])
{
F[to[i]][]=fa[to[i]]=x;
dfs(to[i]);
}
lst[x]=tim;
} void build(int k,int l,int r)
{
if(l==r)
{
mx[k]=dep[dy[l]];
return;
}
int mid=l+r>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
mx[k]=max(mx[k<<],mx[k<<|]);
} void down(int k)
{
mx[k<<]+=tag[k];
tag[k<<]+=tag[k];
mx[k<<|]+=tag[k];
tag[k<<|]+=tag[k];
tag[k]=;
} void change(int k,int l,int r,int opl,int opr,int w)
{
if(l>=opl && r<=opr)
{
mx[k]+=w;
tag[k]+=w;
return;
}
if(tag[k]) down(k);
int mid=l+r>>;
if(opl<=mid) change(k<<,l,mid,opl,opr,w);
if(opr>mid) change(k<<|,mid+,r,opl,opr,w);
mx[k]=max(mx[k<<],mx[k<<|]);
} void Change(int x,int w)
{
if(x==root) change(,,n,,n,w);
else if(id[x]>id[root] && id[x]<=lst[root]) change(,,n,id[x],lst[x],w);
else
{
int t=root,c=dep[root]-dep[x]-;
for(int i=lim;i>=;--i)
if(c&(<<i)) t=F[t][i];
if(id[t]>) change(,,n,,id[t]-,w);
if(lst[t]<n) change(,,n,lst[t]+,n,w);
}
} int query1(int k,int l,int r,int pos)
{
if(l==r) return mx[k];
if(tag[k]) down(k);
int mid=l+r>>;
if(pos<=mid) return query1(k<<,l,mid,pos);
return query1(k<<|,mid+,r,pos);
} void query2(int k,int l,int r,int opl,int opr)
{
if(l>=opl && r<=opr)
{
ans=max(ans,mx[k]);
return;
}
if(tag[k]) down(k);
int mid=l+r>>;
if(opl<=mid) query2(k<<,l,mid,opl,opr);
if(opr>mid) query2(k<<|,mid+,r,opl,opr);
} void push_down(int x)
{
if(rev[x])
{
if(ch[x][]) rev[ch[x][]]^=;
if(ch[x][]) rev[ch[x][]]^=;
rev[x]^=;
}
} bool is_root(int x)
{
return ch[fa[x]][]!=x && ch[fa[x]][]!=x;
} bool get_son(int x)
{
return ch[fa[x]][]==x;
} void rotate(int x)
{
int y=fa[x],z=fa[y];
bool k=ch[y][]==x;
if(!is_root(y)) ch[z][ch[z][]==y]=x;
ch[y][k]=ch[x][k^]; ch[x][k^]=y;
fa[x]=z; fa[y]=x; fa[ch[y][k]]=y;
} void splay(int x)
{
st[top=]=x;
for(int i=x;!is_root(i);i=fa[i]) st[++top]=fa[i];
for(int i=top;i;--i) push_down(st[i]);
int y;
while(!is_root(x))
{
y=fa[x];
if(!is_root(y)) rotate(get_son(x)==get_son(y) ? x : y );
rotate(x);
}
} int find_root(int x)
{
push_down(x);
while(ch[x][])
{
x=ch[x][];
push_down(x);
}
return x;
} void access(int x)
{
int t=;
while(x)
{
splay(x);
if(ch[x][]) Change(find_root(ch[x][]),);
ch[x][]=t;
if(t) Change(find_root(t),-);
t=x; x=fa[x];
}
} int get_lca(int u,int v)
{
if(dep[u]<dep[v]) std::swap(u,v);
int d=dep[u]-dep[v];
for(int i=lim;i>=;--i)
if(d&(<<i)) u=F[u][i];
if(u==v) return u;
for(int i=lim;i>=;--i)
if(F[u][i]!=F[v][i]) u=F[u][i],v=F[v][i];
return F[u][];
} int main()
{
int m;
read(n); read(m);
lim=log(n)/log();
int u,v;
for(int i=;i<n;++i)
{
read(u); read(v);
add(u,v);
}
dfs();
for(int j=;j<=lim;++j)
for(int i=;i<=n;++i)
F[i][j]=F[F[i][j-]][j-];
build(,,n);
root=;
int ty;
int lca;
while(m--)
{
read(ty); read(u);
if(ty==) access(u);
else if(ty==)
{
read(v);
lca=get_lca(u,v);
printf("%d\n",query1(,,n,id[u])+query1(,,n,id[v])-query1(,,n,id[lca])*+);
}
else
{
ans=;
query2(,,n,id[u],lst[u]);
printf("%d\n",ans);
}
}
}

bzoj千题计划275:bzoj4817: [Sdoi2017]树点涂色的更多相关文章

  1. [Bzoj4817] [Sdoi2017]树点涂色 (LCT神题)

    4817: [Sdoi2017]树点涂色 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 629  Solved: 371[Submit][Status ...

  2. [BZOJ4817][SDOI2017]树点涂色(LCT+DFS序线段树)

    4817: [Sdoi2017]树点涂色 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 692  Solved: 408[Submit][Status ...

  3. bzoj4817 [Sdoi2017]树点涂色

    Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. ...

  4. BZOJ4817[Sdoi2017]树点涂色——LCT+线段树

    题目描述 Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色.Bob可能会进 ...

  5. BZOJ4817 [Sdoi2017]树点涂色 【LCT + 线段树】

    题目 Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色.Bob可能会进行这 ...

  6. BZOJ4817: [Sdoi2017]树点涂色(LCT)

    Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. ...

  7. [BZOJ4817][SDOI2017]树点涂色:Link-Cut Tree+线段树

    分析 与[BZOJ3779]重组病毒唯一的区别是多了一个链上求实链段数的操作. 因为每条实链的颜色必然不相同且一条实链上不会有两个深度相同的点(好像算法的正确性和第二个条件没什么关系,算了算了),画图 ...

  8. 【BZOJ4817】[Sdoi2017]树点涂色 LCT+线段树

    [BZOJ4817][Sdoi2017]树点涂色 Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路径的权值是:这条路 ...

  9. 【BZOJ4817】树点涂色(LCT,线段树,树链剖分)

    [BZOJ4817]树点涂色(LCT,线段树,树链剖分) 题面 BZOJ Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义 ...

随机推荐

  1. 【BZOJ1499】瑰丽华尔兹(动态规划)

    [BZOJ1499]瑰丽华尔兹(动态规划) 题面 BZOJ 题解 先写部分分 设\(f[t][i][j]\)表示当前在\(t\)时刻,位置在\(i,j\)时走的最多的步数 这样子每一步要么停要么走 时 ...

  2. 【BZOJ1096】【ZJOI2007】仓库建设(斜率优化,动态规划)

    [BZOJ1096][ZJOI2007]仓库建设(斜率优化,动态规划) 题面 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原 ...

  3. 【BZOJ1857】传送带(三分)

    [BZOJ1857]传送带(三分) 题面 Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P, ...

  4. CSS黄金三段--消除边框的影响

    以前常常因为padding.margin等影响了整个边框的大小,只能傻傻的算大小.现在的黄金三段真的是帮了大忙了,下面的代码放在CSS相应的内容中,就可以使得边框的大小就是你设置的width的属性值. ...

  5. 纯css实现图片的灯光照射效果,高逼格图片展示

    先不说技术,看实现的效果, 与原图(左图)相比,‘灯光’ 照射(右图)下的小姐姐是不是更有魅力了!! 那么下面就说说大家关心的技术实现过程. 其实这是我在学习css属性 mix-blend-mode ...

  6. wso2ESB - 在eclipse中启用调试模式

    最近在使用wso2ESB,记录一下使用过程中碰到的坑,先写一篇调试的(前面的工具安装就不介绍了,既然想用调试了说明你已经看过一部分文档了),以后可能会介绍其他功能的使用. 在wso2 ei的文档中,介 ...

  7. 8Manage:数据安全,企业新时代的护航利器

    数据安全,是个老生常谈的话题,但是安全往往是在危险的时候方能体现出来,因此,这也是很容易被人们所忽略的部分.2017年,数据安全事件更是屡屡登上头条,除了个人信息的数据泄露之外,还有网络病毒造成的全球 ...

  8. C++学习-7

    1.面向过程是:数据与操作分离,数据容易被意外修改 2.面向过程通过私有化的权限进行数据封装 3.类型后辍:类名 operator "" _XXXX(int data)  增加后缀 ...

  9. Servlet的监听器

    Listener是Servlet的监听器,它可以监听客户端的请求.服务端的操作等.通过监听器,可以自动激发一些操作,比如监听在线的用户的数量.当增加一个HttpSession时,就激发sessionC ...

  10. MIP (百度移动网页加速器)

    前言:第一次用移动网页加速器,感觉好心情都被弄坏了.确实性能提高了不少,但是限制js,对于一些交互实现都成问题.MIP是Mobile Instant Pages的缩写,指百度移动网页加速器, 是一套应 ...