题目链接:https://www.luogu.org/problemnew/show/P3979
除了换根操作都是裸的树剖
所以换根时考虑:
1.我查询的根等于换的根:无影响
2.我查询的根是换的根的子树:无影响
3.我查询的根是换的根的祖先:查询 除换的根及其往上直到为要查询的根的第一层儿子的祖先(设为S)的子树 以外的所有节点 (此时满足seg[S] <= seg[root] <= seg[S]+size[S]-1)
求LCA 查询1到seg[S]-1 和 seg[S]+size[S]到n 正好避开子树seg[S] 到 seg[S]+size[S]-1

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
#define lson left, mid, rt<<1
#define rson mid + 1, right, rt<<1|1
using namespace std;
const ll maxn = 200000 + 10;
ll tree[maxn<<2], lazy[maxn<<2];
ll seg[maxn], fa[maxn], size[maxn], rev[maxn], son[maxn], deep[maxn], top[maxn], num;
ll node[maxn], res, n, m, root, r;
struct edge{ll from, to, next;
}e[maxn<<2];
ll head[maxn], cnt;
void add(ll u, ll v)
{e[++cnt].from = u;e[cnt].next = head[u];e[cnt].to = v;head[u] = cnt;
}
//--------------------------segment_tree
void PushUP(ll rt)
{tree[rt] = min(tree[rt<<1], tree[rt<<1|1]);
}
void build(ll left, ll right, ll rt)
{if(left == right){tree[rt] = rev[left];return;}ll mid = (left + right)>>1;build(lson);build(rson);PushUP(rt);
}
void PushDOWN(ll rt)
{lazy[rt<<1] = lazy[rt];lazy[rt<<1|1] = lazy[rt];tree[rt<<1] = lazy[rt];tree[rt<<1|1] = lazy[rt];lazy[rt] = 0;
}
void update(ll l, ll r, ll add, ll left, ll right, ll rt)
{if(l <= left && r >= right){tree[rt] = add;lazy[rt] = add;return;}ll mid = (left + right)>>1;if(lazy[rt]) PushDOWN(rt);if(l <= mid) update(l, r, add, lson);if(r > mid) update(l, r, add, rson);PushUP(rt);
}
ll query(ll l, ll r, ll left, ll right, ll rt)
{ll res = 0x7fffffff;if(l <= left && r >= right){return tree[rt];}ll mid = (left + right)>>1;if(lazy[rt]) PushDOWN(rt);if(l <= mid) res = min(res, query(l, r, lson));if(r > mid) res = min(res, query(l, r, rson));return res;
}
//------------------------
void dfs1(ll u, ll f, ll d)
{ll maxson = -1;size[u] = 1;deep[u] = d;fa[u] = f;for(ll i = head[u]; i != -1; i = e[i].next){ll v = e[i].to;if(f != v){dfs1(v, u, d+1);size[u] += size[v];if(size[v] > maxson) son[u] = v, maxson = size[v];}}
}
void dfs2(ll u, ll t)
{seg[u] = ++num;rev[num] = node[u];top[u] = t;if(!son[u]) return;dfs2(son[u], t);for(ll i = head[u]; i != -1; i = e[i].next){ll v = e[i].to;if(v == son[u] || v == fa[u]) continue;dfs2(v,v);}
}
/*ll qRange(ll x, ll y)
{ll ans = 0;while(top[x] != top[y]){if(deep[top[x]] < deep[top[y]]) swap(x, y);res = 0;res = query(seg[top[x]], seg[x], 1, n, 1);ans = (ans + res);x = fa[top[x]];}if(deep[x] > deep[y]) swap(x, y);res = 0;res = query(seg[x], seg[y], 1, n, 1);ans = (ans + res);return ans;
}*/
void updRange(ll x, ll y, ll k)
{while(top[x] != top[y]){if(deep[top[x]] < deep[top[y]]) swap(x, y);update(seg[top[x]], seg[x], k, 1, n, 1);x = fa[top[x]];}if(deep[x] > deep[y]) swap(x, y);update(seg[x], seg[y], k, 1, n, 1);
}
ll LCA(int x, int y)
{while(top[x] != top[y]){if(deep[top[x]] < deep[top[y]]) swap(x, y);x = fa[top[x]];}return deep[x] < deep[y] ? x : y;
}
ll qSon(ll x)
{if(x == r)return query(1, n, 1, n, 1);int p = LCA(r, x);if(p != x)return query(seg[x], seg[x]+size[x]-1, 1, n, 1);int S;for(int i = head[x]; i != -1; i = e[i].next){int v = e[i].to;if(seg[v] <= seg[r] && seg[r] <= seg[v] + size[v] -1 && v != fa[x]){S = v; break;}}return min(query(1, seg[S]-1, 1, n, 1), query(seg[S]+size[S], n, 1, n, 1));
}
int main()
{memset(head, -1, sizeof(head));scanf("%lld%lld",&n,&m);for(ll i = 1; i < n; i++){ll u, v;scanf("%lld%lld",&u,&v);add(u, v), add(v, u);}for(ll i = 1; i <= n; i++)scanf("%lld",&node[i]);scanf("%lld",&root);dfs1(root, 0, 1);dfs2(root, root);build(1,n,1);r = root;for(ll i = 1; i <= m; i++){ll opt, x, y, z;scanf("%lld",&opt);if(opt == 1){scanf("%lld",&x);r = x;}if(opt == 2){scanf("%lld%lld%lld",&x,&y,&z);updRange(x, y, z);}if(opt == 3){scanf("%lld",&x);printf("%lld\n",qSon(x));}}return 0;
}

转载于:https://www.cnblogs.com/MisakaAzusa/p/9414533.html

【luogu P3979 遥远的国度】 题解相关推荐

  1. P3979 遥远的国度

    题目描述 zcwwzdjn在追杀十分sb的zhx,而zhx逃入了一个遥远的国度.当zcwwzdjn准备进入遥远的国度继续追杀时,守护神RapiD阻拦了zcwwzdjn的去路,他需要zcwwzdjn完成 ...

  2. [洛谷P3979]遥远的国度

    题目大意:有一棵$n$个点的树,每个点有一个点权,有三种操作: $1\;x:$把根变成$x$ $2\;u\;v\;x:$把路径$u->v$上的点权改为$x$ $3\;x:$询问以$x$为根的子树 ...

  3. 【luogu P3946 ことりのおやつ】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3946 交好几遍是因为虽然能过一直有提醒..强迫症qwq #include <bits/stdc++.h ...

  4. Luogu P3399 丝绸之路 题解

    原题传送门 题目背景 张骞于公元前138年曾历尽艰险出使过西域.加强了汉朝与西域各国的友好往来.从那以后,一队队骆驼商队在这漫长的商贸大道上行进,他们越过崇山峻岭,将中国的先进技术带向中亚.西亚和欧洲 ...

  5. 2018十二月刷题列表

    Preface \(2018\)年的尾巴,不禁感慨自己这一年的蜕变只能用蜕变来形容了. 而且老叶说我们今年没的参加清北冬令营可以参加CCF在广州二中举办的冬令营,只要联赛\(390+\)就应该可以报. ...

  6. Luogu P1550 [USACO08OCT]打井Watering Hole

    0号结点:农夫John山泉天然矿泉水( by Luogu第一篇题解 #include<cstdio> #include<cstring> #include<algorit ...

  7. Luogu 2495 [SDOI2011]消耗战

    BZOJ 2286 传说中的虚树经典题. 放上我觉得讲的很好的Luogu置顶题解.       传送门 首先考虑一个暴力的$dp$,设$f_x$表示切断$x$的子树中的所有特殊点且保留$x$的最小代价 ...

  8. 洛谷P1035题解 [NOIP2002 普及组] 级数求和

    原文地址:https://luvletter.blog.luogu.org/p1035-ti-jie 题解 本体难度不大,但要注意计算和的时候要使用double类型,千万不能使用float类型,不然会 ...

  9. 洛谷P1055题解 [NOIP2008 普及组] ISBN 号码

    原文地址:https://luvletter.blog.luogu.org/p1055-ti-jie 题解 超级简单的一题,就是要注意输入和输出的分隔符的问题以及ASCII码中0~9这10个数字对应的 ...

  10. 【分块】[LUOGU 旅行规划] 分块+二分+凸包优化

    题目: 题目链接:[LUOGU 旅行规划] 题解: (由于这个,,我竟然还去写了二维凸包的模板题作为练习,,,然而,一点用都没有,,,,) 先解释一下题面的意思:就是一个区间加的操作,再加上一个区间的 ...

最新文章

  1. Win64 驱动内核编程-23.Ring0 InLineHook 和UnHook
  2. 数据库中文乱码问题的解决
  3. Linux软件安装解决方案
  4. java地图 热力图,腾讯地图数据可视化之热力图
  5. seafile 部署_Seafile开启webdav及读写性能测试
  6. 【Git】IDEA项目关联Git的解决方案
  7. 前后端分离重复提交_阿里一面:如何保证API接口数据安全?
  8. leetcode - 120. 三角形最小路径和
  9. 编写一个学生类 student,包含的属性有学号、姓名年龄,将所有学生存储在一个数组中
  10. 7002.ubuntu18.04将软件图标固定到工具栏
  11. AI 芯片崛起!FPGA 工程师的核心竞争力在哪里?
  12. node.js中net网络模块TCP服务端与客户端的使用
  13. 通过 Telnet 在 Linux 终端中观看ASCII 星球大战
  14. iphone 目录大全
  15. 一键快速生成视频字幕的免费工具
  16. MES系统架构初版ZXW
  17. PocketPC常用程序和设置打开命令参数列表
  18. Windows现漏洞 可绕过AppLocker白名单实施攻击
  19. 9. 广义表 - 广义表概念,存储结构,深度/长度,复制算法
  20. 《英语语法新思维 基础版2》读书笔记(一)

热门文章

  1. CentOS 5.2 LVM 新增加一块硬盘的方法
  2. mybatis注册映射文件
  3. linux远程登录提示WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED
  4. pandas 字符串切片后保存_Pandas时间序列基础详解(转换,索引,切片)
  5. [渝粤教育] 中国地质大学 工程地质 复习题 (2)
  6. 【渝粤题库】陕西师范大学800000 地图学原理
  7. 【Python实例第31讲】递归的特征消除法
  8. phpMyAdmin源码配置过程
  9. CFileDialog用法详解
  10. 国内外优秀的源码网站