bzoj3083 遥远的国度
树链剖分,先求出每个点的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 遥远的国度相关推荐
- bzoj3083 遥远的国度 bzoj3626 LCA (树链剖分)
今早刷了两道树剖的题目,用时两小时十五分钟= = 树剖的题目代码量普遍120+ 其实打熟练之后是很容易调的,不熟练的话代码量大可能会因为某些小细节调很久 3083:裸树剖+"换根" ...
- BZOJ3083: 遥远的国度(树链剖分)
题意 $n$个节点的树,每个点有权值,支持三种操作 1. 换根 2.把$x$到$y$路径上节点权值变为$z$ 3.询问路径最小值 Sol 啥?你说这是TopTree的裸题?那你写去啊 很显然,如果没有 ...
- 机器学习中决策树的随机森林_决策树和随机森林在机器学习中的使用
机器学习中决策树的随机森林 机器学习 (Machine Learning) Machine learning is an application of artificial intelligence ...
- 【BZOJ3083】遥远的国度,树链剖分练习
传送门 写在前面:链剖裸题里的战斗机 思路:Drusher向我推荐了这道污题,据说他请Claris调了一周才A,于是我怀着忐忑的心情开始看题,其他操作都好,一个换根把我搞懵逼了,"套spla ...
- P3979 遥远的国度
题目描述 zcwwzdjn在追杀十分sb的zhx,而zhx逃入了一个遥远的国度.当zcwwzdjn准备进入遥远的国度继续追杀时,守护神RapiD阻拦了zcwwzdjn的去路,他需要zcwwzdjn完成 ...
- 【LCT】遥远的国度(P3979)
正题 P3979 题目大意 给你一棵树,让你进行一下操作: 把根节点修改为x 把x到y路径上的点权值修改为v 查询x子树中的最小权值 解题思路 可以用LCT维护该树 查询时先make_root(rt) ...
- BZOJ 3083: 遥远的国度(树链剖分+DFS序)
可以很显而易见的看出,修改就是树链剖分,而询问就是在dfs出的线段树里查询最小值,但由于这道题会修改根节点,所以在查询的时候需判断x是否为root的祖先,如果不是就直接做,是的话应该查询从1-st[y ...
- [洛谷P3979]遥远的国度
题目大意:有一棵$n$个点的树,每个点有一个点权,有三种操作: $1\;x:$把根变成$x$ $2\;u\;v\;x:$把路径$u->v$上的点权改为$x$ $3\;x:$询问以$x$为根的子树 ...
- 【BZOJ 3083】遥远的国度 树剖
一开始看到有换根操作可是把我吓了一跳,我还以为要上top-tree呢,结果一开题解..........心塞 如果除去换根操作的话就是一道裸的树链剖分了,没什么难度,但是加上换根操作以后,别怕,其实联系 ...
最新文章
- 调用实现天气预报功能android,Android编程实现获取新浪天气预报数据的方法
- Core Animation
- UIButton小结
- LeetCode笔记】剑指 Offer 35. 复杂链表的复制(Java、哈希表、原地算法)
- ssm把后端数据传到前端_前端传数据到后台分别JSON和STRING接收 AJAX SPRINGBOOT ssm
- virtual box 针对Unable to load R3 module 解决方案
- Kai - Golang实现的目标检测云服务
- [源码和文档分享]基于JAVA的即时通信软件
- shell 批量修改文件名字
- Java习题>|异常>|throw自定义异常小案例
- VC9.VC10.VC11...各对应什么版本的VS,以及含义
- web渗透测试----30、0day漏洞
- Dell T40服务器系统安装问题
- tmux的安装及用法
- Android主题色设为透明
- 信达生物港交所上市:重点锁定肿瘤领域 募资33亿港元
- lightbox图片展示效果
- 十种进程注入技术介绍:常见注入技术及趋势调查
- 【洛谷】P1462 通往奥格瑞玛的道路
- Androidproject师进阶之路 :《Android开发进阶:从小工到专家》上市啦!
热门文章
- Pytorch《DCGAN模型》
- latex公式在括号中编辑(多行公式)
- MyBatis框架 多表联合查询实现
- Hibernate开发和对象状态
- [ARM]【编译】【实践】 - 浮点编译选项NEON引发的Skia的库Illegal instruction运行错误和解决办法
- virtualbox禁用硬件虚拟化_Mac版Virtualbox6.1开启嵌套虚拟化
- tftp服务器从交换机上下载配置命令_软考网络工程师之交换机和路由(交换机基础)...
- php mysql开发技术_PHP+MySQL开发技术详解—学习笔记
- HTML是万维网核心语言的第几代,Html5相关的知识点总结
- 2 找图像连通域_MATLAB--数字图像处理 简单人脸识别