不算学会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. Uva 12124 Uva Live 3971 - Assemble 二分, 判断器, g++不用map.size() 难度:0

    题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...

  2. python3 爬取简书30日热门,同时存储到txt与mongodb中

    初学python,记录学习过程. 新上榜,七日热门等同理. 此次主要为了学习python中对mongodb的操作,顺便巩固requests与BeautifulSoup. 点击,得到URL https: ...

  3. SpringBoot 上传、下载(四)

    工程目录结构 完整代码: 1.pom.xml 首先当然是添加依赖,用到thymeleaf模板渲染html页面 <project xmlns="http://maven.apache.o ...

  4. 在命令行中的vim编辑器加上行号

    在使用vim编辑器时运行脚本程序纠察缺少相应的行号,检测起来非常不方便, 所以在vim编辑器每行前面加上相应的行号: 输入命令::set nu 按下回车,完成

  5. 某些material英文翻译

    chrome  铬,铬合金, 镀铬 matte  无光泽的,不光滑的 Decal   陶瓷的 duo color  双色 livery  (这个没找到什么吊意思,我看像是一个类似打logo的材质)

  6. 关于macroblaze的一些理解(更新中)

    (1)添加*.elf文件: 在Design Sources工作目录中右键选择添加源文件,找到SDK目录中对应的文件夹下的Debug内*.elf文件,将其添加.然后,源文件目录更新,多出一个ELF文件夹 ...

  7. Centos7安装ansible

    CentOS下部署Ansible自动化工具 1.确保机器上安装的是 Python 2.6 或者 Python 2.7 版本: python -V 2.查看yum仓库中是否存在ansible的rpm包 ...

  8. Java与C++简单对比

    Java语言让编程者无法找到指针来直接访问内存,并且增添了自动的内存管理功能,从而有效的组织了C/C++语言中指针操作失误,如滥用指针所造成的系统崩溃,Java的指针在虚拟机内部使用,这保证了Java ...

  9. shiro简单学习的简单总结

    权限和我有很大渊源. 培训时候的最后一个项目是OA,权限那块却不知如何入手,最后以不是我写的那个模块应付面试. 最开始的是使用session装载用户登录信息,使用简单权限拦截器做到权限控制,利用资源文 ...

  10. <HBase><读写><LSM>

    Overview HBase中的一个big table,首先会按行划分成一些region(这些region之间是有序的,由startkey保证),每个region分配到不同的节点进行存储.因此,reg ...