题目分析:

  操作一很明显等价于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. Jmeter(三十六)_运行过程中改变负载

    顾名思义,jmeter在做性能测试时,可以在不停止脚本的情况下修改负载压力,达到期望的测试效果.我们将通过Constant Throughput Timer(吞吐量计时器)和Beanshell服务器来 ...

  2. handsontable 的核心方法

    原文地址:http://blog.csdn.net/mafan121/article/details/46122577 1.为handsontable添加钩子方法 addHook(key,callba ...

  3. VMware(威睿)后端开发笔试题总结

    1.   Linux中查看系统的发行版本信息 的命令? cat/etc/issue    和    lsb_release 2.   linux 挂载一个共享文件夹: mount  -t  cifc ...

  4. Vue2 实现树形菜单(多级菜单)功能模块

    结构示意图 ├── index.html ├── main.js ├── router │ └── index.js # 路由配置文件 ├── components # 组件目录 │ ├── App. ...

  5. 爬虫——xpath

    1.什么是xpath? Xpath,全称XML Path Language,即XML路径语言.它是一门在XML之后查找信息的语言,也同样适用于HTML文档的搜索.在做爬虫的时候,我们用XPath语言来 ...

  6. 微信小程序开发的基本流程

    微信小程序开发的基本流程 一,微信小程序简介 1,微信小程序简称小程序,张小龙在微信公开课 Pro 上发布的小程序正式上线,时间是2017年1月9日. 2,微信小程序这个词可以分解为“微信”和“小程序 ...

  7. Chrome浏览器的版本查看 以及V8 javascript 引擎版本查看

    1. 发现chrome浏览器最新版本里面带的V8 引擎 版本号与chrome的版本号有一个关系, 这里简单总结一下: 在地址栏里面输入: chrome://version 即可显示出来 比如我正在使用 ...

  8. Oracle 备份表数据

    --备份表数据 select * from t_owners; --创建备份表 create table t_owners_copy ( id number, name ), addressid nu ...

  9. C# Note30: 软件加密机制以及如何防止反编译

    参考文章: C#软件license管理(简单软件注册机制) 软件加密技术和注册机制 .NET中的许可证机制--License 背景 .net是一种建立在虚拟机上执行的语言,它直接生成 MSIL 的中间 ...

  10. java中级——集合框架【2】-二叉树

    二叉树 二叉树概念 首先我们要明确,二叉树由各种节点组成:还有就是二叉树特点:(1)每个节点都可以有左子节点,右子节点(2)每一个节点都有一个值 如图所示: 代码所示: package cn.jse. ...