题目分析:

  操作一很明显等价于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. H5 59-浮动元素的脱标

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. Docker 安装和配置

    #centos 6 需要另外安装 yum install lxc libcgroup device-mapper-ecent-libs 推荐centos7 安装深事#centos 7 直接安装就好yu ...

  3. Bootstrap知识记录:排版样式

    ---恢复内容开始--- 一.页面排版Bootstrap 提供了一些常规设计好的页面排版的样式供开发者使用.1.页面主体Bootstrap 将全局font-size 设置为14px,line-heig ...

  4. 6-1 Quantifiers

    1 Quantifiers are used to describe the number or amount of something. Certain quantifiers are used w ...

  5. redis4.X

    tar -zxvf ****cd /redismakecd /srcmake install vi redis.confdaemonize yes mkdir /usr/local/redis/bin ...

  6. HDU 4913 Least common multiple

    题目:Least common multiple 链接:http://acm.hdu.edu.cn/showproblem.php?pid=4913 题意:有一个集合s,包含x1,x2,...,xn, ...

  7. ORA-12541:TNS:无监听程序 解决办法

    昨天我在一台win7笔记本中安装了oracle11g,然后打算用另一个win10的笔记本使用plsql developer局域网内连接访问oracle数据库.但是遇到ORA-12541:TNS:无监听 ...

  8. 关于 html input标签的几个常用操作

    1.清除 input 标签默认样式 input { -moz-appearance: none; outline: 0; text-decoration: none; outline: none; b ...

  9. windows浏览器访问虚拟机开的rabbitmq服务,无法访问

    根据这个博主的建议 https://blog.csdn.net/csdnliuxin123524/article/details/78207427 换了一个浏览器上火狐浏览器输入“localhost: ...

  10. Python 构建工具 buildout 的介绍与使用

    来到了新公司上班,首先就是得把自己的环境给搭起来.知乎使用了buildout作为python项目的构建工具. 那么什么是 buildout ? buildout的是一款自动化构建工具.由Zope团队开 ...