不算学会lct。。。。。。

原题:

Bob有一棵n个点的有根树,其中1号点是根节点。Bob在每个点上涂了颜色,并且每个点上的颜色不同。定义一条路
径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色。Bob可能会进行这几种操作:
1 x:
把点x到根节点的路径上所有的点染上一种没有用过的新颜色。
2 x y:
求x到y的路径的权值。
3 x y:
在以x为根的子树中选择一个点,使得这个点到根节点的路径权值最大,求最大权值。
Bob一共会进行m次操作
1<=n,m<=100000
 
并不严格的lct,只需要access操作,而且链存在的意义也不是为了优化时间复杂度
恩所以一开始每个点都是一条链,表示每个点都是一个颜色
access就相当于点到根染成同一种颜色
求路径权值就在链上跳一跳即可
子树最大指的话就一开始就搞出dfs序和线段树,因为树的形态并没有改变,然后access的时候维护即可
代码:
 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int rd(){int z=,mk=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')mk=-; ch=getchar();}
while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
return z*mk;
}
struct edg{int nxt,y;}e[]; int lk[],ltp=;
inline void ist(int x,int y){ e[++ltp].nxt=lk[x],lk[x]=ltp,e[ltp].y=y;}
int n,m;
int fth[],chd[][],tpf[];
int acst[][],dp[],dod[],lod[],rod[],cod=;
int v[],vt[];
void dfs(int x){
dod[lod[x]=++cod]=x;
for(int i=lk[x];i;i=e[i].nxt)if(e[i].y!=acst[x][])
acst[e[i].y][]=fth[e[i].y]=x,dp[e[i].y]=dp[x]+,dfs(e[i].y);
rod[x]=cod;
}
int lca(int x,int y){
if(dp[x]<dp[y]) swap(x,y);
for(int i=,j=dp[x]-dp[y];i<=;++i)if((<<i)&j) x=acst[x][i];
for(int i=;i>=;--i)if(acst[x][i]!=acst[y][i])
x=acst[x][i],y=acst[y][i];
if(x==y) return x;
return acst[x][];
}
void pshd(int x){
v[x<<]+=vt[x],v[x<<|]+=vt[x];
vt[x<<]+=vt[x],vt[x<<|]+=vt[x];
vt[x]=;
}
void gtsgmttr(int x,int l,int r){
if(l==r){ v[x]=dp[dod[l]]+; return ;}
int md=(l+r)>>;
gtsgmttr(x<<,l,md),gtsgmttr(x<<|,md+,r);
v[x]=max(v[x<<],v[x<<|]);
}
void mdf(int x,int l,int r,int ql,int qr,int z){
if(l==ql && r==qr){ v[x]+=z,vt[x]+=z; return ;}
int md=(l+r)>>; pshd(x);
if(ql<=md && qr>md) mdf(x<<,l,md,ql,md,z),mdf(x<<|,md+,r,md+,qr,z);
else if(qr<=md) mdf(x<<,l,md,ql,qr,z);
else mdf(x<<|,md+,r,ql,qr,z);
v[x]=max(v[x<<],v[x<<|]);
}
int qur(int x,int l,int r,int ql,int qr){
if(l==ql && r==qr) return v[x];
int md=(l+r)>>; pshd(x);
if(ql<=md && qr>md) return max(qur(x<<,l,md,ql,md),qur(x<<|,md+,r,md+,qr));
else if(qr<=md) return qur(x<<,l,md,ql,qr);
else return qur(x<<|,md+,r,ql,qr);
}
inline bool isrt(int x){ return (chd[fth[x]][]!=x)&(chd[fth[x]][]!=x);}
void pshu(int x){ tpf[x]=chd[x][] ? tpf[chd[x][]] : x;}
void rtt(int x){
int y=fth[x],z=fth[fth[x]],l,r;
r=(chd[y][]==x); l=r^;
if(!isrt(y)) chd[z][chd[z][]==y]=x;
fth[x]=z,fth[y]=x,fth[chd[x][r]]=y;
chd[y][l]=chd[x][r],chd[x][r]=y;
pshu(y),pshu(x);
}
void sply(int x){
while(!isrt(x)){
int y=fth[x],z=fth[fth[x]];
if(!isrt(y)) rtt((chd[y][]==x)^(chd[z][]==y) ? x : y);
rtt(x);
}
}
void accs(int x){
int lst=;
while(x){
sply(x);
if(chd[x][]) mdf(,,n,lod[tpf[chd[x][]]],rod[tpf[chd[x][]]],);
if(lst) mdf(,,n,lod[tpf[lst]],rod[tpf[lst]],-);
chd[x][]=lst,x=fth[lst=x];
}
}
int gtnm(int x){
int bwl=;
while(x){
sply(x);
x=fth[x],++bwl;
}
return bwl;
}
int cclt(int x,int y){
int z=lca(x,y);
return gtnm(x)+gtnm(y)-(gtnm(z)<<)+;
}
int main(){//freopen("ddd.in","r",stdin);
int l,r,mk;
cin>>n>>m;
for(int i=;i<n;++i) l=rd(),r=rd(),ist(l,r),ist(r,l);
dfs(),gtsgmttr(,,n);
for(int i=;i<=n;++i) tpf[i]=i;
for(int i=;i<=n;++i)for(int j=;(<<j)<=dp[i];++j)
acst[i][j]=acst[acst[i][j-]][j-];
while(m--){
mk=rd();
if(mk==) accs(rd());
else if(mk==) printf("%d\n",cclt(rd(),rd()));
else l=rd(),printf("%d\n",qur(,,n,lod[l],rod[l]));
}
return ;
}

【BZOJ4817】【SDOI2017】树点染色的更多相关文章

  1. SDOI2017 树点染色

    \[SDOI2017 树点染色\] 题目描述 Bob 有一棵 $ n $ 个点的有根树,其中 $ 1 $ 号点是根节点.Bob 在每个节点上涂了颜色,并且每个点上的颜色不同. 定义一条路径的权值是,这 ...

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

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

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

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

  4. bzoj4817 [Sdoi2017]树点涂色

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

  5. bzoj千题计划275:bzoj4817: [Sdoi2017]树点涂色

    http://www.lydsy.com/JudgeOnline/problem.php?id=4817 lct+线段树+dfs序 操作1:access 操作2:u到根的-v到根的-lca到根的*2+ ...

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

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

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

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

  8. loj2001[SDOI2017]树点染色

    题意:给你一棵树,一开始每个点上的颜色互不相同.三种操作:op1:x到根的路径上的点都染上一种新的颜色.op2:设一条路径的权值为val(x,y),求x到y路径的val.op3:询问x的子树中最大的到 ...

  9. SDOI2017树点染色

    题目链接 发现1操作很像lct中的access,然后它每次染的又是一个新颜色,因此同一个颜色就在同一颗splay里了,且一个点到根的权值val[i]也就是到根路径上虚边的个数,然后看access时会对 ...

  10. 洛谷3703 [SDOI2017] 树点染色 【LCT】【线段树】

    题目分析: 操作一很明显等价于LCT上的access操作,操作二是常识,操作三转化到dfs序上求最大值也是常识.access的时候顺便在线段树中把对应部分-1,把右子树的子树+1即可. 代码: #in ...

随机推荐

  1. python select poll epoll的区别

    select 优点:为最早的异步io处理模块,他可以再linux上和windows上使用,跨平台兼容性好,而poll和epoll都不能在windows系统环境中使用. 缺点:select的机制决定了他 ...

  2. @ResponseBody中文乱码解决方案

    java web项目,使用了springmvc4.0,用@ResponseBody返回中文字符串,乱码$$ 本以为很简单的问题,不过也找了一个小时. 网上有说这样配置的: <mvc:annota ...

  3. useful links about machine learning

    机器学习(Machine Learning)&深度学习(Deep Learning)资料(Chapter 1) 机器学习(Machine Learning)&深度学习(Deep Lea ...

  4. 生成器 Generators

    function* quips(name) { yield "你好 " + name + "!"; yield "希望你能喜欢这篇介绍ES6的译文&q ...

  5. bootstrap table 列求和

    <div class="modal fade in" id="_modalDialog" tabindex="1" role=&quo ...

  6. mybatis动态sql #和$的区别

    $和#都支持动态sql:就是你传什么它就是什么 区别: 1.#可以防止sql注入在sql执行时显示 '?' 比$安全 SELECT * FROM table WHERE id = ? 2.在使用#传入 ...

  7. openstack网络DVR

    一.DVR描述 分布式路由 二.相关的专业术语 术语名称 术语解释 SNAT 在路由器后(POSTROUTING)将内网的ip地址修改为外网网卡的ip地址,也就是绑定浮动IP和外部通信 DNAT 在路 ...

  8. nginx——ngx_http_gzip_module

    文件压缩 Syntax: gzip on | off; Default: gzip off; Context: http, server, location, if in location Synta ...

  9. centos7设置默认的内核启动

    centos内核启动时会有3个选项,只有一个可以正常登陆到图形界面的桌面: 下面是设置默认内核的顺序: centos的内核文件在/boot/grub2目录下 1.如果想要修改以上三项的显示顺序,只需要 ...

  10. 12.输入一个成绩计算其A,B,C,D,E等级

    #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int score; s ...