树链剖分,先求出每个点的dfs序区间,查询时假设当前根为x,查询点为y,他们的dfs序分别为[xl,xr],[yl,yr],有三种情况,第一种x=y那么直接输出[1,n]的最小值,第二种这两个区间分离或者[xl,xr]包含[yl,yr],那么直接查询[yl,yr]的最小值,第三种[yl,yr]包含[xl,xr],找到x到y的路径上离y最近的点z,其区间为[zl,zr],那么需要输出min([1,zl-1],[zr+1,n])。

  代码

  1 #include<cstdio>
  2 #include<algorithm>
  3 #define N 2000010
  4 using namespace std;
  5 typedef long long ll;
  6 int dp,pre[N],p[N],tt[N],f[N],gf[N],go[N];
  7 int L[N],R[N],tot,n,m,i,deep[N];
  8 int l[N],r[N],a,b,root,typ;
  9 int jump[110000][19];
 10 ll value[N],e[N],c,v[N],s[N],inf;
 11 void link(int x,int y)
 12 {
 13     dp++;pre[dp]=p[x];p[x]=dp;tt[dp]=y;
 14 }
 15 void dfs1(int x,int fa)
 16 {
 17     int i;
 18     s[x]=1;f[x]=fa;deep[x]=deep[fa]+1;
 19     jump[x][0]=fa;for (i=1;i<=17;i++) jump[x][i]=jump[jump[x][i-1]][i-1];
 20     i=p[x];
 21     while (i)
 22     {
 23         if (tt[i]!=fa)
 24         {
 25             dfs1(tt[i],x);
 26             s[x]+=s[tt[i]];
 27             if (s[tt[i]]>s[go[x]]) go[x]=tt[i];
 28         }
 29         i=pre[i];
 30     }
 31 }
 32 void dfs2(int x,int Fa,int fa)
 33 {
 34     int i=p[x];
 35     L[x]=++tot;gf[x]=Fa;e[tot]=value[x];
 36     if (go[x]) dfs2(go[x],Fa,x);
 37     while (i)
 38     {
 39         if ((tt[i]!=fa)&&(tt[i]!=go[x]))
 40             dfs2(tt[i],tt[i],x);
 41         i=pre[i];
 42     }
 43     R[x]=tot;
 44 }
 45 void build(int x,int a,int b)
 46 {
 47     l[x]=a;r[x]=b;
 48     if (b-a>1)
 49     {
 50         int m=(l[x]+r[x])>>1;
 51         build(2*x,a,m);
 52         build(2*x+1,m,b);
 53         s[x]=min(s[2*x],s[2*x+1]);
 54     }
 55     else
 56         s[x]=e[b];
 57 }
 58 void clean(int x)
 59 {
 60     if (v[x])
 61     {
 62         s[x]=v[x];
 63         v[2*x]=v[x];
 64         v[2*x+1]=v[x];
 65         v[x]=0;
 66     }
 67 }
 68 void change(int x,int a,int b,ll c)
 69 {
 70     clean(x);
 71     if ((a<=l[x])&&(r[x]<=b))
 72     {
 73         v[x]=c;
 74         return;
 75     }
 76     int m=(l[x]+r[x])>>1;
 77     if (a<m)change(2*x,a,b,c);
 78     if (m<b)change(2*x+1,a,b,c);
 79     clean(2*x);clean(2*x+1);
 80     s[x]=min(s[2*x],s[2*x+1]);
 81 }
 82 ll query(int x,int a,int b)
 83 {
 84     clean(x);
 85     if ((a<=l[x])&&(r[x]<=b))
 86         return s[x];
 87     int m;
 88     ll ans=inf;
 89     m=(l[x]+r[x])>>1;
 90     if (a<m) ans=min(ans,query(2*x,a,b));
 91     if (m<b) ans=min(ans,query(2*x+1,a,b));
 92     return ans;
 93 }
 94 void gao(int a,int b,ll c)
 95 {
 96     while (1)
 97     {
 98         if (gf[a]==gf[b])
 99         {
100             if (deep[a]<deep[b]) a^=b^=a^=b;
101             change(1,L[b]-1,L[a],c);
102             return;
103         }
104         else
105         {
106             if (deep[gf[a]]<deep[gf[b]]) a^=b^=a^=b;
107             change(1,L[gf[a]]-1,L[a],c);
108             a=f[gf[a]];
109         }
110     }
111 }
112 int find(int x,int y)
113 {
114     int i;
115     for (i=17;i>=0;i--)
116     if (deep[jump[x][i]]>deep[y]) x=jump[x][i];
117     return x;
118 }
119 int main()
120 {
121     inf=1000000000;inf=inf*10;
122     scanf("%d%d",&n,&m);
123     for (i=1;i<n;i++)
124     {
125         scanf("%d%d",&a,&b);
126         link(a,b);link(b,a);
127     }
128     for (i=1;i<=n;i++)
129     scanf("%lld",&value[i]);
130     dfs1(1,0);
131     dfs2(1,1,0);
132     build(1,0,n);
133     scanf("%d",&root);
134     for (i=1;i<=m;i++)
135     {
136         scanf("%d",&typ);
137         if (typ==1) scanf("%d",&root);
138         else
139         if (typ==2)
140         {
141             scanf("%d%d%lld",&a,&b,&c);
142             gao(a,b,c);
143         }
144         else
145         {
146             scanf("%d",&a);
147             if (a==root)
148             printf("%lld\n",query(1,0,n));
149             else
150             if ((L[a]<=L[root])&&(R[root]<=R[a]))
151             {
152                 b=find(root,a);
153                 c=inf;
154                 if (L[b]-1>0) c=min(c,query(1,0,L[b]-1));
155                 if (R[b]<n) c=min(c,query(1,R[b],n));
156                 printf("%lld\n",c);
157             }
158             else
159             printf("%lld\n",query(1,L[a]-1,R[a]));
160         }
161     }
162 }

转载于:https://www.cnblogs.com/fzmh/p/5424972.html

bzoj3083 遥远的国度相关推荐

  1. bzoj3083 遥远的国度 bzoj3626 LCA (树链剖分)

    今早刷了两道树剖的题目,用时两小时十五分钟= = 树剖的题目代码量普遍120+ 其实打熟练之后是很容易调的,不熟练的话代码量大可能会因为某些小细节调很久 3083:裸树剖+"换根" ...

  2. BZOJ3083: 遥远的国度(树链剖分)

    题意 $n$个节点的树,每个点有权值,支持三种操作 1. 换根 2.把$x$到$y$路径上节点权值变为$z$ 3.询问路径最小值 Sol 啥?你说这是TopTree的裸题?那你写去啊 很显然,如果没有 ...

  3. 机器学习中决策树的随机森林_决策树和随机森林在机器学习中的使用

    机器学习中决策树的随机森林 机器学习 (Machine Learning) Machine learning is an application of artificial intelligence ...

  4. 【BZOJ3083】遥远的国度,树链剖分练习

    传送门 写在前面:链剖裸题里的战斗机 思路:Drusher向我推荐了这道污题,据说他请Claris调了一周才A,于是我怀着忐忑的心情开始看题,其他操作都好,一个换根把我搞懵逼了,"套spla ...

  5. P3979 遥远的国度

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

  6. 【LCT】遥远的国度(P3979)

    正题 P3979 题目大意 给你一棵树,让你进行一下操作: 把根节点修改为x 把x到y路径上的点权值修改为v 查询x子树中的最小权值 解题思路 可以用LCT维护该树 查询时先make_root(rt) ...

  7. BZOJ 3083: 遥远的国度(树链剖分+DFS序)

    可以很显而易见的看出,修改就是树链剖分,而询问就是在dfs出的线段树里查询最小值,但由于这道题会修改根节点,所以在查询的时候需判断x是否为root的祖先,如果不是就直接做,是的话应该查询从1-st[y ...

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

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

  9. 【BZOJ 3083】遥远的国度 树剖

    一开始看到有换根操作可是把我吓了一跳,我还以为要上top-tree呢,结果一开题解..........心塞 如果除去换根操作的话就是一道裸的树链剖分了,没什么难度,但是加上换根操作以后,别怕,其实联系 ...

最新文章

  1. 调用实现天气预报功能android,Android编程实现获取新浪天气预报数据的方法
  2. Core Animation
  3. UIButton小结
  4. LeetCode笔记】剑指 Offer 35. 复杂链表的复制(Java、哈希表、原地算法)
  5. ssm把后端数据传到前端_前端传数据到后台分别JSON和STRING接收 AJAX SPRINGBOOT ssm
  6. virtual box 针对Unable to load R3 module 解决方案
  7. Kai - Golang实现的目标检测云服务
  8. [源码和文档分享]基于JAVA的即时通信软件
  9. shell 批量修改文件名字
  10. Java习题>|异常>|throw自定义异常小案例
  11. VC9.VC10.VC11...各对应什么版本的VS,以及含义
  12. web渗透测试----30、0day漏洞
  13. Dell T40服务器系统安装问题
  14. tmux的安装及用法
  15. Android主题色设为透明
  16. 信达生物港交所上市:重点锁定肿瘤领域 募资33亿港元
  17. lightbox图片展示效果
  18. 十种进程注入技术介绍:常见注入技术及趋势调查
  19. 【洛谷】P1462 通往奥格瑞玛的道路
  20. Androidproject师进阶之路 :《Android开发进阶:从小工到专家》上市啦!

热门文章

  1. Pytorch《DCGAN模型》
  2. latex公式在括号中编辑(多行公式)
  3. MyBatis框架 多表联合查询实现
  4. Hibernate开发和对象状态
  5. [ARM]【编译】【实践】 - 浮点编译选项NEON引发的Skia的库Illegal instruction运行错误和解决办法
  6. virtualbox禁用硬件虚拟化_Mac版Virtualbox6.1开启嵌套虚拟化
  7. tftp服务器从交换机上下载配置命令_软考网络工程师之交换机和路由(交换机基础)...
  8. php mysql开发技术_PHP+MySQL开发技术详解—学习笔记
  9. HTML是万维网核心语言的第几代,Html5相关的知识点总结
  10. 2 找图像连通域_MATLAB--数字图像处理 简单人脸识别