【BZOJ4817】【SDOI2017】树点染色
不算学会lct。。。。。。
原题:
#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】树点染色的更多相关文章
- SDOI2017 树点染色
\[SDOI2017 树点染色\] 题目描述 Bob 有一棵 $ n $ 个点的有根树,其中 $ 1 $ 号点是根节点.Bob 在每个节点上涂了颜色,并且每个点上的颜色不同. 定义一条路径的权值是,这 ...
- [BZOJ4817][SDOI2017]树点涂色(LCT+DFS序线段树)
4817: [Sdoi2017]树点涂色 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 692 Solved: 408[Submit][Status ...
- [Bzoj4817] [Sdoi2017]树点涂色 (LCT神题)
4817: [Sdoi2017]树点涂色 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 629 Solved: 371[Submit][Status ...
- bzoj4817 [Sdoi2017]树点涂色
Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. ...
- bzoj千题计划275:bzoj4817: [Sdoi2017]树点涂色
http://www.lydsy.com/JudgeOnline/problem.php?id=4817 lct+线段树+dfs序 操作1:access 操作2:u到根的-v到根的-lca到根的*2+ ...
- BZOJ4817[Sdoi2017]树点涂色——LCT+线段树
题目描述 Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色.Bob可能会进 ...
- BZOJ4817 [Sdoi2017]树点涂色 【LCT + 线段树】
题目 Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色.Bob可能会进行这 ...
- loj2001[SDOI2017]树点染色
题意:给你一棵树,一开始每个点上的颜色互不相同.三种操作:op1:x到根的路径上的点都染上一种新的颜色.op2:设一条路径的权值为val(x,y),求x到y路径的val.op3:询问x的子树中最大的到 ...
- SDOI2017树点染色
题目链接 发现1操作很像lct中的access,然后它每次染的又是一个新颜色,因此同一个颜色就在同一颗splay里了,且一个点到根的权值val[i]也就是到根路径上虚边的个数,然后看access时会对 ...
- 洛谷3703 [SDOI2017] 树点染色 【LCT】【线段树】
题目分析: 操作一很明显等价于LCT上的access操作,操作二是常识,操作三转化到dfs序上求最大值也是常识.access的时候顺便在线段树中把对应部分-1,把右子树的子树+1即可. 代码: #in ...
随机推荐
- 删除所有已经停止的容器 docker rm $(docker ps -a -q)
杀死所有正在运行的容器docker kill $(docker ps -a -q) 删除所有已经停止的容器docker rm $(docker ps -a -q) 删除所有未打 dangling 标签 ...
- 《Python》 计算机基础
一.计算机基础: cpu:中央处理器,相当于人的大脑,运算中心,控制中心. 内存:暂时存储数据,与CPU交互. 优点:内存读取速度快. 缺点:容量小,造价高,断电即消失. 硬盘:长期存储数据. 优点: ...
- Express工作原理和源码分析一:创建路由
Express是一基于Node的一个框架,用来快速创建Web服务的一个工具,为什么要使用Express呢,因为创建Web服务如果从Node开始有很多繁琐的工作要做,而Express为你解放了很多工作, ...
- Cracking The Coding Interview 4.4
//Given a binary search tree, design an algorithm which creates a linked list of all the nodes at ea ...
- 1076 Wifi密码
下面是微博上流传的一张照片:“各位亲爱的同学们,鉴于大家有时需要使用 wifi,又怕耽误亲们的学习,现将 wifi 密码设置为下列数学题答案:A-1:B-2:C-3:D-4:请同学们自己作答,每两日一 ...
- IDEA中maven的依赖jar包报红
问题描述: 查看本地的repository中有相关的jar包,但是在IDEA中就是报红(下面红色波浪线) 解决方法: 将pom.xml中相关的dependcy配置注释掉,maven中jar包就会删除. ...
- 软件工程结对作业01 psp表格
- TensorFlow函数:tf.zeros_like
tf.zeros_like函数 tf.zeros_like( tensor, dtype=None, name=None, optimize=True ) 定义在:tensorflow/python/ ...
- dos命令:window10程序控制命令
一.A appwiz.cpl::程序和功能 二.C calc:启动计算器 certmgr.msc:证书管理实用程 charmap:启动字符映射表 chkdsk.exe:Chkdsk:磁盘检查(管理员身 ...
- 解决Cannot resolve reference to bean 'txPointcut' while setting bean property 'pointcut'
忘记导入了 这三个jar包...