记最开始的根为root,换根之后,对于当前的根rtnow和询问子树U而言,

①rtnow==U,询问整棵树

②fa[rtnow]==U,询问除了rtnow所在子树以外的整棵树

③rtnow在U的子树里,且距离大于1,询问除了rtnow的除了其祖先是U的儿子的祖先的子树以外的整棵树

④rtnow不在U的子树里,询问U的子树

对于③,在树链上跳跳就好了,也可以暴力,复杂度无法保证。

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cmath>
  4. using namespace std;
  5. #define N 100001
  6. #define INF 2147483647
  7. #define lson rt<<1,l,m
  8. #define rson rt<<1|1,m+1,r
  9. int v[N<<1],en,next[N<<1],first[N];
  10. void AddEdge(int U,int V)
  11. {
  12. v[++en]=V;
  13. next[en]=first[U];
  14. first[U]=en;
  15. }
  16. int n,m,root,a[N];
  17. int Ls[N],Rs[N],top[N],siz[N],fa[N],dep[N],tot,son[N],rtnow,Map[N];
  18. void dfs(int U)
  19. {
  20. siz[U]=1;
  21. for(int i=first[U];i;i=next[i])
  22. if(v[i]!=fa[U])
  23. {
  24. fa[v[i]]=U;
  25. dep[v[i]]=dep[U]+1;
  26. dfs(v[i]);
  27. siz[U]+=siz[v[i]];
  28. if(siz[v[i]]>siz[son[U]])
  29. son[U]=v[i];
  30. }
  31. }
  32. void dfs2(int U)
  33. {
  34. Ls[U]=++tot;
  35. Map[tot]=U;
  36. if(son[U])
  37. {
  38. top[son[U]]=top[U];
  39. dfs2(son[U]);
  40. }
  41. for(int i=first[U];i;i=next[i])
  42. if(v[i]!=fa[U]&&v[i]!=son[U])
  43. {
  44. top[v[i]]=v[i];
  45. dfs2(v[i]);
  46. }
  47. Rs[U]=tot;
  48. }
  49. int minv[N<<2],cov[N<<2];
  50. void pushdown(int rt)
  51. {
  52. if(cov[rt])
  53. {
  54. cov[rt<<1]=cov[rt<<1|1]=minv[rt<<1]=minv[rt<<1|1]=cov[rt];
  55. cov[rt]=0;
  56. }
  57. }
  58. void update(int ql,int qr,int v,int rt,int l,int r)
  59. {
  60. if(ql<=l&&r<=qr)
  61. {
  62. cov[rt]=minv[rt]=v;
  63. return;
  64. }
  65. pushdown(rt);
  66. int m=(l+r>>1);
  67. if(ql<=m) update(ql,qr,v,lson);
  68. if(m<qr) update(ql,qr,v,rson);
  69. minv[rt]=min(minv[rt<<1],minv[rt<<1|1]);
  70. }
  71. int query(int ql,int qr,int rt,int l,int r)
  72. {
  73. if(ql<=l&&r<=qr) return minv[rt];
  74. pushdown(rt);
  75. int m=(l+r>>1),res=INF;
  76. if(ql<=m) res=min(res,query(ql,qr,lson));
  77. if(m<qr) res=min(res,query(ql,qr,rson));
  78. return res;
  79. }
  80. void Update(int U,int V,int W)
  81. {
  82. int f1=top[U],f2=top[V],res=INF;
  83. while(f1!=f2)
  84. {
  85. if(dep[f1]<dep[f2])
  86. {
  87. swap(f1,f2);
  88. swap(U,V);
  89. }
  90. update(Ls[f1],Ls[U],W,1,1,n);
  91. U=fa[U];
  92. f1=top[U];
  93. }
  94. if(dep[U]>dep[V])
  95. swap(U,V);
  96. update(Ls[U],Ls[V],W,1,1,n);
  97. }
  98. int main()
  99. {
  100. // freopen("bzoj3083.in","r",stdin);
  101. int A,B,C,op;
  102. scanf("%d%d",&n,&m);
  103. for(int i=1;i<n;++i)
  104. {
  105. scanf("%d%d",&A,&B);
  106. AddEdge(A,B);
  107. AddEdge(B,A);
  108. }
  109. for(int i=1;i<=n;++i) scanf("%d",&a[i]);
  110. scanf("%d",&root);
  111. top[root]=root;
  112. dfs(root);
  113. dfs2(root);
  114. for(int i=1;i<=n;++i) update(Ls[i],Ls[i],a[i],1,1,n);
  115. for(;m;--m)
  116. {
  117. scanf("%d",&op);
  118. if(op==1) scanf("%d",&rtnow);
  119. else if(op==2)
  120. {
  121. scanf("%d%d%d",&A,&B,&C);
  122. Update(A,B,C);
  123. }
  124. else
  125. {
  126. scanf("%d",&A);
  127. if(A==rtnow)
  128. printf("%d\n",query(1,n,1,1,n));
  129. else if(fa[rtnow]==A)
  130. printf("%d\n",min(query(1,Ls[rtnow]-1,1,1,n),Rs[rtnow]==n?INF:query(Rs[rtnow]+1,n,1,1,n)));
  131. else if(Ls[rtnow]>=Ls[A]&&Ls[rtnow]<=Rs[A])
  132. {
  133. int U=rtnow;
  134. while(fa[top[U]]!=A&&top[U]!=top[A])
  135. U=fa[top[U]];
  136. if(fa[top[U]]!=A)
  137. U=Map[Ls[A]+1];
  138. else
  139. U=top[U];
  140. printf("%d\n",min(query(1,Ls[U]-1,1,1,n),Rs[U]==n?INF:query(Rs[U]+1,n,1,1,n)));
  141. }
  142. else
  143. printf("%d\n",query(Ls[A],Rs[A],1,1,n));
  144. }
  145. }
  146. return 0;
  147. }

【树链剖分】【线段树】bzoj3083 遥远的国度的更多相关文章

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

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

  2. 【BZOJ-2325】道馆之战 树链剖分 + 线段树

    2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1153  Solved: 421[Submit][Statu ...

  3. 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树

    [BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...

  4. BZOJ2243 (树链剖分+线段树)

    Problem 染色(BZOJ2243) 题目大意 给定一颗树,每个节点上有一种颜色. 要求支持两种操作: 操作1:将a->b上所有点染成一种颜色. 操作2:询问a->b上的颜色段数量. ...

  5. POJ3237 (树链剖分+线段树)

    Problem Tree (POJ3237) 题目大意 给定一颗树,有边权. 要求支持三种操作: 操作一:更改某条边的权值. 操作二:将某条路径上的边权取反. 操作三:询问某条路径上的最大权值. 解题 ...

  6. bzoj4034 (树链剖分+线段树)

    Problem T2 (bzoj4034 HAOI2015) 题目大意 给定一颗树,1为根节点,要求支持三种操作. 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子 ...

  7. HDU4897 (树链剖分+线段树)

    Problem Little Devil I (HDU4897) 题目大意 给定一棵树,每条边的颜色为黑或白,起始时均为白. 支持3种操作: 操作1:将a->b的路径中的所有边的颜色翻转. 操作 ...

  8. Aizu 2450 Do use segment tree 树链剖分+线段树

    Do use segment tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.bnuoj.com/v3/problem_show ...

  9. 【POJ3237】Tree(树链剖分+线段树)

    Description You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edg ...

  10. HDU 2460 Network(双连通+树链剖分+线段树)

    HDU 2460 Network 题目链接 题意:给定一个无向图,问每次增加一条边,问个图中还剩多少桥 思路:先双连通缩点,然后形成一棵树,每次增加一条边,相当于询问这两点路径上有多少条边,这个用树链 ...

随机推荐

  1. POJ3169:Layout(差分约束)

    Layout Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15705   Accepted: 7551 题目链接:http ...

  2. POJ2516:Minimum Cost(最小费用最大流)

    Minimum Cost Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 19088   Accepted: 6740 题目链 ...

  3. Good Substrings CodeForces - 271D

    You've got string s, consisting of small English letters. Some of the English letters are good, the ...

  4. jaspersoft中分组打印

    一:前言 使用IReport已经四个月了,最近在做一个保镖,是要按照类型分类,并且这些类型要横着打印,最后还要算这个类型金额的总值,这张报表现是说需要用到子报表,最后和一个同事一起用group来分组做 ...

  5. bzoj1503 郁闷的出纳员 splay版

    自己yy的写法 可能有点奇怪吧 详情看代码 还是蛮短的 #include<cstdio> #include<cstring> #include<algorithm> ...

  6. [bzoj4765]普通计算姬——分块

    Brief Description 给定一棵n个节点的带权树,节点编号为1到n,以root为根,设sum[p]表示以点p为根的这棵子树中所有节点的权 值和.支持下列两种操作: 1 给定两个整数u,v, ...

  7. 用 C# 代码如何实现让你的电脑关机,重启,注销,锁定,休眠,睡眠

    简介 本文讲述了用 C# 代码如何实现让你的电脑关机,重启,注销,锁定,休眠,睡眠. 如何实现 首先,使用 using 语句添加我们需要的命名空间: using System.Diagnostics; ...

  8. MySQL-based databases CVE-2016-6664 本地提权

    @date: 2016/11/10 @author: dlive 0x00 前言 这个漏洞可以结合CVE-2016-6663使用提升权限到root 0x01 漏洞原文 # http://legalha ...

  9. 打包工具 Inno Setup 5

    转载: http://www.360doc.com/content/13/0327/13/4221543_274235049.shtml

  10. UVA 10471 Gift Exchanging

    题意:就5种盒子,给出每个盒子个数,盒子总数,每个人选择这个盒子的概率.求这个人选择哪个盒子取得第一个朋友的概率最大,最大多少 dp[N][sta]表示当前第N个人面临状态sta(选择盒子的状态可以用 ...