题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3083

换根后路径还是不变,子树分类讨论一下,树剖后线段树维护即可。

代码如下:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #define mid ((l+r)>>1)
  5. #define ls (x<<1)
  6. #define rs (x<<1|1)
  7. using namespace std;
  8. typedef long long ll;
  9. int const xn=1e5+;
  10. int n,m,hd[xn],ct,to[xn<<],nxt[xn<<],rt;
  11. int tim,dfn[xn],fa[xn],siz[xn],son[xn],dep[xn],top[xn],id[xn];
  12. ll a[xn],mn[xn<<],lzy[xn<<],inf=1e17;
  13. ll rd()
  14. {
  15. ll ret=,f=; char ch=getchar();
  16. while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
  17. while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
  18. return f?ret:-ret;
  19. }
  20. ll minn(ll x,ll y){return x<y?x:y;}
  21. void add(int x,int y){to[++ct]=y; nxt[ct]=hd[x]; hd[x]=ct;}
  22. void dfs(int x,int ff)
  23. {
  24. fa[x]=ff; dep[x]=dep[ff]+; siz[x]=;
  25. for(int i=hd[x],u;i;i=nxt[i])
  26. {
  27. if((u=to[i])==ff)continue;
  28. dfs(u,x); siz[x]+=siz[u];
  29. if(siz[u]>siz[son[x]])son[x]=u;
  30. }
  31. }
  32. void dfsx(int x)
  33. {
  34. dfn[x]=++tim; id[tim]=x;
  35. if(son[x])top[son[x]]=top[x],dfsx(son[x]);
  36. for(int i=hd[x],u;i;i=nxt[i])
  37. if((u=to[i])!=fa[x]&&u!=son[x])top[u]=u,dfsx(u);
  38. }
  39. void build(int x,int l,int r)
  40. {
  41. if(l==r){mn[x]=a[id[l]]; return;}//id!!
  42. build(ls,l,mid); build(rs,mid+,r);
  43. mn[x]=minn(mn[ls],mn[rs]);
  44. }
  45. void turn(int x,ll v){mn[x]=v; lzy[x]=v;}
  46. void pushdown(int x)
  47. {
  48. if(!lzy[x])return;
  49. turn(ls,lzy[x]); turn(rs,lzy[x]);
  50. lzy[x]=;
  51. }
  52. void update(int x,int l,int r,int L,int R,ll v)
  53. {
  54. if(l>=L&&r<=R){turn(x,v); return;}
  55. pushdown(x);
  56. if(mid>=L)update(ls,l,mid,L,R,v);
  57. if(mid<R)update(rs,mid+,r,L,R,v);
  58. mn[x]=minn(mn[ls],mn[rs]);
  59. }
  60. ll query(int x,int l,int r,int L,int R)
  61. {
  62. if(L>R)return inf;
  63. if(l>=L&&r<=R)return mn[x];
  64. pushdown(x); ll ret=inf;
  65. if(mid>=L)ret=minn(ret,query(ls,l,mid,L,R));
  66. if(mid<R)ret=minn(ret,query(rs,mid+,r,L,R));
  67. return ret;
  68. }
  69. void change(int x,int y,ll v)
  70. {
  71. while(top[x]!=top[y])
  72. {
  73. if(dep[top[x]]<dep[top[y]])swap(x,y);
  74. update(,,n,dfn[top[x]],dfn[x],v); x=fa[top[x]];
  75. }
  76. if(dep[x]<dep[y])swap(x,y);
  77. update(,,n,dfn[y],dfn[x],v);
  78. }
  79. int find(int x,int y)//y in x
  80. {
  81. while(top[y]!=top[x])
  82. {
  83. if(fa[top[y]]==x)return top[y];
  84. y=fa[top[y]];
  85. }
  86. return son[x];
  87. }
  88. ll ask(int x)
  89. {
  90. if(x==rt)return query(,,n,,n);
  91. if(dfn[rt]<dfn[x]||dfn[rt]>=dfn[x]+siz[x])
  92. return query(,,n,dfn[x],dfn[x]+siz[x]-);
  93. int y=find(x,rt);
  94. return minn(query(,,n,,dfn[y]-),query(,,n,dfn[y]+siz[y],n));
  95. }
  96. int main()
  97. {
  98. n=rd(); m=rd();
  99. for(int i=,x,y;i<n;i++)x=rd(),y=rd(),add(x,y),add(y,x);
  100. dfs(,); top[]=; dfsx();
  101. for(int i=;i<=n;i++)a[i]=rd();
  102. build(,,n);
  103. rt=rd(); ll z;
  104. for(int i=,opt,x,y;i<=m;i++)
  105. {
  106. opt=rd(); x=rd();
  107. if(opt==)rt=x;
  108. if(opt==)y=rd(),z=rd(),change(x,y,z);
  109. if(opt==)printf("%lld\n",ask(x));
  110. }
  111. return ;
  112. }

bzoj 3083 遥远的国度 —— 树链剖分的更多相关文章

  1. BZOJ 3083 遥远的国度 树链剖分

    3083: 遥远的国度 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 797  Solved: 181[Submit][Status] Descrip ...

  2. BZOJ 3083 遥远的国度(树链剖分+LCA)

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

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

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

  4. BZOJ 3083 遥远的国度 树链剖分+线段树

    有换根的树链剖分的裸题. 在换根的时候注意讨论. 注意数据范围要开unsigned int或longlong #include<iostream> #include<cstdio&g ...

  5. BZOJ 3083: 遥远的国度 [树链剖分 DFS序 LCA]

    3083: 遥远的国度 Time Limit: 10 Sec  Memory Limit: 1280 MBSubmit: 3127  Solved: 795[Submit][Status][Discu ...

  6. bzoj 3083 遥远的国度——树链剖分+线段树维护子树信息

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3083 int 的范围是 2^31 - 1 ,所以权值是不是爆 int 了…… O( nlog ...

  7. BZOJ 3083 遥远的国度 树链剖分+脑子

    唉..又调了半天QWQ..为何读入挂了.....莫非读入是反着的????据ywy学长所言如是...OvO震惊 这啥骚题啊...还要换根...不过清明讲过...(然鹅我现在才做... 先随便选个点(比如 ...

  8. BZOJ 2243 染色 | 树链剖分模板题进阶版

    BZOJ 2243 染色 | 树链剖分模板题进阶版 这道题呢~就是个带区间修改的树链剖分~ 如何区间修改?跟树链剖分的区间询问一个道理,再加上线段树的区间修改就好了. 这道题要注意的是,无论是线段树上 ...

  9. 【bzoj3083】遥远的国度 树链剖分+线段树

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

随机推荐

  1. Jeecms 防xss处理原理

    Web.xml配置过滤器,并指的要过滤和替换的字符: 过滤器的filter方法,对传入的HttpServletRequest对象进行了修改 具体过滤在XssHttpServletRequestWrap ...

  2. 转 开启“大数据”时代--大数据挑战与NoSQL数据库技术 iteye

    一直觉得“大数据”这个名词离我很近,却又很遥远.最近不管是微博上,还是各种技术博客.论坛,碎碎念大数据概念的不胜枚举. 在我的理解里,从概念理解上来讲,大数据的目的在于更好的数据分析,否则如此大数据的 ...

  3. 多图切换jQuery图片滑块插件

    在线演示 本地下载

  4. jQuery悬浮焦点图宽屏

    在线演示 本地下载

  5. java 遍历数组的几种方式

    本文总结自: https://www.cnblogs.com/hellochennan/p/5373186.html 1. 传统方式 非常简单的for循环 int[] a = {1, 2, 3, 4} ...

  6. C语言中的位操作(16)--计算二进制数字尾部连续0的数目

    本篇文章介绍计算二进制数字尾部连续0的数目的相关算法,例如:v=(1101000)2,该数尾部连续0的数目=3 方法1:线性时间算法 unsigned int v; // 需要计算的目标整数 int ...

  7. Luogu P1377 [TJOI2011]树的序:离线nlogn建二叉搜索树

    题目链接:https://www.luogu.org/problemnew/show/P1377 题意: 有一棵n个节点的二叉搜索树. 给出它的插入序列,是一个1到n的排列. 问你使得树的形态相同的字 ...

  8. 分享知识-快乐自己:Mybatis 基础动态语句

    目录: User: package mlq.bean; /** * 用户实体类 */ public class User { private Integer uId; private String u ...

  9. Python基础-set集合操作

    set集合,是一个无序且不重复的元素集合.定义方式类似字典使用{}创建 目前我们学过的数据类型: 1.字符串(str),2.整型(int),3.浮点型(float),4,列表(list) 5.元组(t ...

  10. POJ 2421 Constructing Roads(Kruskal算法)

    题意:给出n个村庄之间的距离,再给出已经连通起来了的村庄.求把所有的村庄都连通要修路的长度的最小值. 思路:Kruskal算法 课本代码: //Kruskal算法 #include<iostre ...