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

int 的范围是 2^31 - 1 ,所以权值是不是爆 int 了……

O( nlog2n ) 也能过?

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #define ll long long
  5. #define ls Ls[cr]
  6. #define rs Rs[cr]
  7. using namespace std;
  8. const int N=1e5+,M=N<<,K=;const ll INF=(1ll<<);
  9. int n,hd[N],xnt,to[M],nxt[M],rt; ll w[N];
  10. int dfn[N],rnk[N],tl[N],siz[N],son[N],fa[N],top[N],dep[N];
  11. int tot,Ls[M],Rs[M]; ll sm[M],tg[M];
  12. int rdn()
  13. {
  14. int ret=;bool fx=;char ch=getchar();
  15. while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
  16. while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
  17. return fx?ret:-ret;
  18. }
  19. ll rdl()
  20. {
  21. ll ret=;bool fx=;char ch=getchar();
  22. while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
  23. while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
  24. return fx?ret:-ret;
  25. }
  26. ll Mn(ll a,ll b){return a<b?a:b;}
  27. void add(int x,int y){to[++xnt]=y;nxt[xnt]=hd[x];hd[x]=xnt;}
  28. void dfs(int cr,int f)
  29. {
  30. fa[cr]=f;siz[cr]=;dep[cr]=dep[f]+;
  31. for(int i=hd[cr],v;i;i=nxt[i])
  32. if((v=to[i])!=f)
  33. {
  34. dfs(v,cr);siz[cr]+=siz[v];
  35. if(siz[v]>siz[son[cr]])son[cr]=v;
  36. }
  37. }
  38. void dfsx(int cr)
  39. {
  40. dfn[cr]=++tot;rnk[tot]=cr;
  41. if(son[cr])top[son[cr]]=top[cr],dfsx(son[cr]);
  42. for(int i=hd[cr],v;i;i=nxt[i])
  43. if((v=to[i])!=fa[cr]&&v!=son[cr])
  44. top[v]=v,dfsx(v);
  45. tl[cr]=tot;
  46. }
  47. void build(int l,int r,int cr)
  48. {
  49. if(l==r){sm[cr]=w[rnk[l]];return;}
  50. int mid=l+r>>;
  51. ls=++tot;build(l,mid,ls);
  52. rs=++tot;build(mid+,r,rs);
  53. sm[cr]=Mn(sm[ls],sm[rs]);
  54. }
  55. void pshd(int cr)
  56. {
  57. if(!tg[cr])return;
  58. tg[ls]=tg[rs]=sm[ls]=sm[rs]=tg[cr];tg[cr]=;
  59. }
  60. void mdfy(int l,int r,int cr,int L,int R,ll k)
  61. {
  62. if(l>=L&&r<=R){sm[cr]=tg[cr]=k;return;}
  63. int mid=l+r>>;pshd(cr);
  64. if(L<=mid)mdfy(l,mid,ls,L,R,k);
  65. if(mid<R)mdfy(mid+,r,rs,L,R,k);
  66. sm[cr]=Mn(sm[ls],sm[rs]);
  67. }
  68. ll query(int l,int r,int cr,int L,int R)
  69. {
  70. if(L>R)return INF;//don't forget!!!
  71. if(l>=L&&r<=R)return sm[cr];
  72. int mid=l+r>>;pshd(cr);
  73. if(mid<L)return query(mid+,r,rs,L,R);
  74. if(R<=mid)return query(l,mid,ls,L,R);
  75. return Mn(query(l,mid,ls,L,R),query(mid+,r,rs,L,R));
  76. }
  77. void mdfy(int x,int y,ll k)
  78. {
  79. while(top[x]!=top[y])
  80. {
  81. if(dep[top[x]]<dep[top[y]])swap(x,y);
  82. mdfy(,n,,dfn[top[x]],dfn[x],k);
  83. x=fa[top[x]];
  84. }
  85. if(dep[x]<dep[y])swap(x,y);
  86. mdfy(,n,,dfn[y],dfn[x],k);
  87. }
  88. int fnd(int x,int f)
  89. {
  90. while(dep[fa[top[x]]]>dep[f])x=fa[top[x]];
  91. if(dep[fa[top[x]]]==dep[f])return top[x];
  92. return son[f];
  93. }
  94. ll query(int x)
  95. {
  96. if(rt==x)return query(,n,,,n);
  97. if(dfn[rt]>dfn[x]&&dfn[rt]<=tl[x])
  98. {
  99. int d=fnd(rt,x);
  100. return Mn(query(,n,,,dfn[d]-),query(,n,,tl[d]+,n));
  101. }
  102. return query(,n,,dfn[x],tl[x]);
  103. }
  104. int main()
  105. {
  106. n=rdn();int Q=rdn();
  107. for(int i=,u,v;i<n;i++)
  108. u=rdn(),v=rdn(),add(u,v),add(v,u);
  109. for(int i=;i<=n;i++)w[i]=rdl();
  110. dfs(,);top[]=;dfsx();
  111. tot=;build(,n,);
  112. rt=rdn();int op,x,y;ll k;
  113. while(Q--)
  114. {
  115. op=rdn();x=rdn();
  116. if(op==)rt=x;
  117. if(op==)
  118. {
  119. y=rdn();k=rdl();mdfy(x,y,k);
  120. }
  121. if(op==)printf("%lld\n",query(x));
  122. }
  123. return ;
  124. }

bzoj 3083 遥远的国度——树链剖分+线段树维护子树信息的更多相关文章

  1. BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 )

    BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 ) 题意分析 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 ...

  2. BZOJ.1036 [ZJOI2008]树的统计Count ( 点权树链剖分 线段树维护和与最值)

    BZOJ.1036 [ZJOI2008]树的统计Count (树链剖分 线段树维护和与最值) 题意分析 (题目图片来自于 这里) 第一道树链剖分的题目,谈一下自己的理解. 树链剖分能解决的问题是,题目 ...

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

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

  4. BZOJ 3672[NOI2014]购票(树链剖分+线段树维护凸包+斜率优化) + BZOJ 2402 陶陶的难题II (树链剖分+线段树维护凸包+分数规划+斜率优化)

    前言 刚开始看着两道题感觉头皮发麻,后来看看题解,发现挺好理解,只是代码有点长. BZOJ 3672[NOI2014]购票 中文题面,题意略: BZOJ 3672[NOI2014]购票 设f(i)f( ...

  5. bzoj 4196 [Noi2015]软件包管理器 (树链剖分+线段树)

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2852  Solved: 1668[Submit][Sta ...

  6. bzoj 2157: 旅游【树链剖分+线段树】

    裸的树链剖分+线段树 但是要注意一个地方--我WA了好几次才发现取完相反数之后max值和min值是要交换的-- #include<iostream> #include<cstdio& ...

  7. BZOJ 3589 动态树 (树链剖分+线段树)

    前言 众所周知,90%90\%90%的题目与解法毫无关系. 题意 有一棵有根树,两种操作.一种是子树内每一个点的权值加上一个同一个数,另一种是查询多条路径的并的点权之和. 分析 很容易看出是树链剖分+ ...

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

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

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

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

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

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

随机推荐

  1. 35-THREE.JS 多面体

    <!DOCTYPE html> <html> <head> <title></title> <script src="htt ...

  2. C# 图片缩放,拖拽后保存成图片的功能

    窗体界面部分如下: 鼠标的缩放功能需要手动在 OpertaionImg.Designer.cs 文件里面添加一句代码,具体代码如下: //picturePhoto显示图片的控件 this.pictur ...

  3. HTML条件注释判断浏览器版本命令

    <!--[if !IE]><!--> 除IE外都可识别 <!--<![endif]--> <!--[if IE]> 所有的IE可识别 <![ ...

  4. nodejs之log4js日志记录模块简单配置使用

    在我的一个node express项目中,使用了log4js来生成日志并且保存到文件里,生成的文件如下: 文件名字叫:access.log 如果在配置log4js的时候允许了同时存在多个备份log文件 ...

  5. DB2导入导出数据

    1.导出表数据到txt文件: export to /brcb_edp/data_public_edp/file/CCDM/file/FILE_CCDM_DR_CARD_CUST_DET.txt of ...

  6. 在CentOS7 安装ffmpeg

    参考自:https://linuxize.com/post/how-to-install-ffmpeg-on-centos-7/ 首先切换至root用户 yum install epel-releas ...

  7. dilworth定理+属性排序(木棍加工)

    P1233 木棍加工 题目描述 一堆木头棍子共有n根,每根棍子的长度和宽度都是已知的.棍子可以被一台机器一个接一个地加工.机器处理一根棍子之前需要准备时间.准备时间是这样定义的: 第一根棍子的准备时间 ...

  8. L147 Low Cost Study Has High Impact Results For Premature Babies

    No one knows exactly why some babies are born prematurely(早产), but some of the smallest premature ba ...

  9. Sqlserver 存储过程 返回-6

    存储过程中没有返回 手动返回-6的代码,但是一直接收到-6返回值. 经最后研究发现,是粗心导致的,Insert插入数据时在非空字段插入了Null值导致出现异常,所以返回了-6. 所以说在事务中,可能会 ...

  10. SQL 动态PIVOT查询

    DECLARE @sql_str VARCHAR(8000)DECLARE @sql_col VARCHAR(8000) SELECT @sql_col = ISNULL(@sql_col + ',' ...