题目分析:

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

代码:

 #include<bits/stdc++.h>
using namespace std; const int maxn = ; int num,n,m; vector <int> g[maxn]; int f[maxn],dep[maxn],dfsin[maxn],dfsout[maxn]; class SegmentTree{
private:
int data[maxn<<],lazy[maxn<<],maxx[maxn<<];
void push_down(int now){
int L = (now<<),R = (now<<|);
data[L] += lazy[now]; maxx[L] += lazy[now]; lazy[L] += lazy[now];
data[R] += lazy[now]; maxx[R] += lazy[now]; lazy[R] += lazy[now];
lazy[now] = ;
}
public:
void Add(int now,int tl,int tr,int l,int r,int d){
if(lazy[now]&&tl!=tr) push_down(now);
if(tl >= l && tr <= r){
data[now] += d; lazy[now] += d;maxx[now] += d; return;
}
if(tl > r || tr < l) return;
int mid = (tl+tr)/;
Add(now<<,tl,mid,l,r,d);
Add(now<<|,mid+,tr,l,r,d);
maxx[now] = max(maxx[now<<],maxx[now<<|]);
}
int Query(int now,int tl,int tr,int l,int r){
if(lazy[now]&&tl!=tr) push_down(now);
if(tl >= l && tr <= r) return maxx[now];
if(tl > r || tr < l) return ;
int mid = (tl+tr)/;
int ans = max(Query(now<<,tl,mid,l,r),Query(now<<|,mid+,tr,l,r));
maxx[now] = max(maxx[now<<],maxx[now<<|]);
return ans;
}
}T; class LinkCutTree{
private:
int ch[maxn][],fa[maxn],data[maxn];
stack <int> sta; int is_root(int now){return ch[fa[now]][]!=now&&ch[fa[now]][]!=now;} void r0(int now,int dr){
int son = ch[now][dr],pa = fa[now],gp = fa[pa];
int tag = is_root(pa);
ch[pa][dr^] = son; fa[son] = pa;
ch[now][dr] = pa; fa[pa] = now; fa[now] = gp;
if(tag == ) return;
if(ch[gp][] == pa) ch[gp][] = now;
else ch[gp][] = now;
} void splay(int now){
while(!is_root(now)){
int pa = fa[now],gp = fa[pa];
if(is_root(pa)){
if(ch[pa][] == now) r0(now,);
else r0(now,);
}else{
if(ch[gp][] == pa){
if(ch[pa][] == now) r0(pa,),r0(now,);
else r0(now,),r0(now,);
}else{
if(ch[pa][] == now) r0(now,),r0(now,);
else r0(pa,),r0(now,);
}
}
}
}
public:
void access(int now){
int p = now,last = ;
while(p != ){
splay(p);
int zz = ch[p][]; while(ch[zz][]) zz = ch[zz][];
if(zz)T.Add(,,n,dfsin[zz],dfsout[zz],);
int lt = p; while(ch[lt][]) lt = ch[lt][];
T.Add(,,n,dfsin[lt],dfsout[lt],-);
ch[p][] = last;
last = p; p = fa[p];
}
T.Add(,,n,,n,);
}
void BuildLCT(){
for(int i=;i<=n;i++) data[i] = dep[i];
for(int i=;i<=n;i++) fa[i] = f[i];
}
}LCT; void read(){
scanf("%d%d",&n,&m);
for(int i=;i<n;i++){
int u,v; scanf("%d%d",&u,&v);
g[u].push_back(v); g[v].push_back(u);
}
} int RMQ[maxn<<][],app[maxn][],euler[maxn<<],nE; void dfs(int now,int fa,int dp){
f[now] = fa; dep[now] = dp;
euler[++nE] = now; app[now][] = app[now][] = nE;
dfsin[now] = dfsout[now] = ++num;
T.Add(,,n,dfsin[now],dfsin[now],dp);
for(int i=;i<g[now].size();i++){
int p = g[now][i];
if(p == fa) continue;
dfs(p,now,dp+);
dfsout[now] = dfsout[p];
euler[++nE] = now; app[now][] = nE;
}
} void BuildRMQ(){
for(int i=;i<=nE;i++) RMQ[i][] = euler[i];
for(int k=;(<<k)<=nE;k++){
for(int i=;i<=nE;i++){
if(i+(<<k-) > nE) {RMQ[i][k] = RMQ[i][k-];continue;}
if(dep[RMQ[i][k-]] < dep[RMQ[i+(<<k-)][k-]]){
RMQ[i][k] = RMQ[i][k-];
}else RMQ[i][k] = RMQ[i+(<<k-)][k-];
}
}
} int QueryLCA(int u,int v){
int fst = min(app[u][],app[v][]),sec = max(app[u][],app[v][]);
int len = sec-fst+,k = ;
while((<<k+) <= len) k++;
if(dep[RMQ[fst][k]] < dep[RMQ[sec-(<<k)+][k]]) return RMQ[fst][k];
else return RMQ[sec-(<<k)+][k];
} void init(){
dfs(,,);
BuildRMQ();
LCT.BuildLCT();
} void getdist(){
int u,v; scanf("%d%d",&u,&v);
int lca = QueryLCA(u,v);
u = dfsin[u],v = dfsin[v],lca = dfsin[lca];
int ans = T.Query(,,n,u,u)+T.Query(,,n,v,v);
ans = ans - *T.Query(,,n,lca,lca) + ;
printf("%d\n",ans);
} void Query(){
int u; scanf("%d",&u);
int ans = T.Query(,,n,dfsin[u],dfsout[u]);
printf("%d\n",ans);
} void work(){
for(int i=;i<=m;i++){
int cas; scanf("%d",&cas);
if(cas == ){int x;scanf("%d",&x);LCT.access(x);}
else if(cas == ) getdist();
else if(cas == ) Query();
}
} int main(){
read();
init();
work();
return ;
}

洛谷3703 [SDOI2017] 树点染色 【LCT】【线段树】的更多相关文章

  1. HDU 2665.Kth number-可持久化线段树(无修改区间第K小)模板 (POJ 2104.K-th Number 、洛谷 P3834 【模板】可持久化线段树 1(主席树)只是输入格式不一样,其他几乎都一样的)

    Kth number Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  2. POJ 2104 K-th Number && 洛谷 P3834 【模板】可持久化线段树 1(主席树)

    我惊奇的发现这两道题一模一样 题目背景 这是个非常经典的主席树入门题——静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个整数构成的序列,将对于指定的闭区间查询 ...

  3. 洛谷3703 SDOI2017树点涂色(LCT+线段树+dfs序)

    又一道好题啊qwqqqq 一开始看这个题,还以为是一个树剖的什么毒瘤题目 (不过的确貌似可以用树剖啊) qwq这真是一道\(LCT\)维护颜色的好题 首先,我们来一个一个操作的考虑. 对于操作\(1\ ...

  4. 【SDOI2017】树点染色【线段树+LCT】

    本来只是想练练LCT,没想到是个线段树 对于操作1:诶新的颜色?这不是access吗? 也就是说,我们用一棵splay来表示一种颜色 操作2直接在LCT上乱搞-- 不对啊,操作3要查子树 诶好像是静态 ...

  5. 【洛谷4219】[BJOI2014]大融合(线段树分治)

    题目: 洛谷4219 分析: 很明显,查询的是删掉某条边后两端点所在连通块大小的乘积. 有加边和删边,想到LCT.但是我不会用LCT查连通块大小啊.果断弃了 有加边和删边,还跟连通性有关,于是开始yy ...

  6. 洛谷P2982 [USACO10FEB]慢下来Slowing down(线段树 DFS序 区间增减 单点查询)

    To 洛谷.2982 慢下来Slowing down 题目描述 Every day each of Farmer John's N (1 <= N <= 100,000) cows con ...

  7. Bzoj1018/洛谷P4246 [SHOI2008]堵塞的交通(线段树分治+并查集)

    题面 Bzoj 洛谷 题解 考虑用并查集维护图的连通性,接着用线段树分治对每个修改进行分治. 具体来说,就是用一个时间轴表示图的状态,用线段树维护,对于一条边,我们判断如果他的存在时间正好在这个区间内 ...

  8. 【Foreign】染色 [LCT][线段树]

    染色 Time Limit: 20 Sec  Memory Limit: 256 MB Description Input Output Sample Input 13 0 1 0 2 1 11 1 ...

  9. 洛谷 P1083 借教室【二分+差分/线段树】

    二分mid,然后用1~mid的操作在差分序列上加减,最后把差分序列前缀和起来,看是否有有超过初始r值的 #include<iostream> #include<cstdio> ...

  10. 3.28 省选模拟赛 染色 LCT+线段树

    发现和SDOI2017树点涂色差不多 但是当时这道题模拟赛的时候不会写 赛后也没及时订正 所以这场模拟赛的这道题虽然秒想到了LCT和线段树但是最终还是只是打了暴力. 痛定思痛 还是要把这道题给补了. ...

随机推荐

  1. 用Flask+Redis维护代理池

    GitHub:https://github.com/LXL-YAN/ProxyPool 视频讲解:https://www.bilibili.com/video/av19057145/?p=17

  2. Python_练习题_49

    # 3.用map来处理字符串列表,把列表中所有人都变成sb,比方alex_sb name=['alex','wupeiqi','yuanhao','nezha'] def func(item): re ...

  3. 01-JavaScript介绍

    JavaScript价绍 1.引言 Web前端有三层: HTML:从语义的角度,描述页面结构 CSS:从审美的角度,描述样式(美化页面) JavaScript:从交互的角度,描述行为(提升用户体验) ...

  4. R语言线性回归

    回归分析是一个广泛使用的统计工具,用于建立两个变量之间的关系模型. 这些变量之一称为预测变量,其值通过实验收集. 另一个变量称为响应变量,其值来自预测变量. 在线性回归中,这两个变量通过一个等式相关联 ...

  5. 运行Maven项目时出现invalid LOC header (bad signature)错误,Tomcat不能正常启动

    作为Maven小白,今天这问题困扰了我好久,经过多次在网上查询,终于找到了原因.明明一个小问题却耗费很多时间,着实不应该,所以必须记录一下. 报错信息如下: 对话框: 控制台: <span st ...

  6. adb通过wifi连接android设备

    问题背景 近期的项目测试中,需要将移动设备与厂商机器进行usb连接视频传输(投屏).测试过程中需要定位问题,经常需要查看实时日志,移动设备已经和厂商机器usb连接投屏,无法用usb连接到PC,那么有什 ...

  7. JEECG SSO kisso

    kisso: java 基于 Cookie 的 SSO 中间件 kisso https://gitee.com/baomidou/kisso kisso首页.文档和下载 - 基于 Cookie 的 S ...

  8. MyBatis全局配置文件的各项标签3

    mapper 将sql映射注册到全局配置中,这个我们在上一章已经使用过了, resource 这个属性是用来引用类路径下的sql映射文件 url 这个属性是用来引用网络路径或磁盘路径下的sql映射文件 ...

  9. Java 多线程概述

    几乎所有的操作系统都支持同时运行多个任务,一 个任务通常就是一个程序,每个运行中的程序就是一个进程.当一个程序运行时,内部可能包含了多个顺序执行流,每个顺序执行流就是一个线程. 线程和进程 几乎所有的 ...

  10. Web移动端---iPhone X适配(底部栏黑横线)

    一.相信大家有被iPhone X底部黑色横线支配的恐惧 上面我们可以看到,底部的导航栏被一条黑色横线所盖住,那么就很烦.下面我们可以开始进行适配环节 1.首先我们可以用 JS 判断手机环境是不是 iP ...