树剖裸题?(复习练练手)

  1. // luogu-judger-enable-o2
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5. int n,vis[],size[],dep[],fa[][],val[],wson[],t1,t2,t3,t4,ind;
  6. int tid[],sid[],top[],eg1[],eg2[];
  7. vector <pair<int,int> > g[];
  8. char str[];
  9.  
  10. void dfs1(int p){
  11. vis[p]=;
  12. size[p]=;
  13. for(int i=;i<g[p].size();i++) {
  14. if(vis[g[p][i].first]==) {
  15. dep[g[p][i].first]=dep[p]+;
  16. fa[g[p][i].first][]=p;
  17. val[g[p][i].first]=g[p][i].second;
  18. dfs1(g[p][i].first);
  19. size[p]+=size[g[p][i].first];
  20. if(size[g[p][i].first]>size[wson[p]])
  21. wson[p]=g[p][i].first;
  22. }
  23. }
  24. }
  25.  
  26. void dfs2(int p){
  27. vis[p]=;
  28. tid[++ind]=p;
  29. sid[p]=ind;
  30. if(wson[p]) {
  31. top[wson[p]]=top[p];
  32. dfs2(wson[p]);
  33. }
  34. for(int i=;i<g[p].size();i++) {
  35. if(vis[g[p][i].first]==) {
  36. top[g[p][i].first]=g[p][i].first;
  37. dfs2(g[p][i].first);
  38. }
  39. }
  40. }
  41.  
  42. void lca_presolve() {
  43. for(int i=;i<=;i++)
  44. for(register int j=;j<=n;j++)
  45. fa[j][i]=fa[fa[j][i-]][i-];
  46. }
  47.  
  48. inline int lca(int p,int q){
  49. if(dep[p]<dep[q]) swap(p,q);
  50. for(register int i=;i>=;i--)
  51. if(dep[fa[p][i]]>=dep[q]) p=fa[p][i];
  52. for(register int i=;i>=;i--)
  53. if(fa[p][i]-fa[q][i]) p=fa[p][i],q=fa[q][i];
  54. if(p-q) p=fa[p][], q=fa[q][];
  55. return max(p,q);
  56. }
  57.  
  58. int a[],sq[];
  59.  
  60. void pushup(int p) {
  61. a[p]=max(a[p*],a[p*+]);
  62. }
  63.  
  64. void build(int p,int l,int r) {
  65. if(l==r) a[p]=sq[l];
  66. else build(p*,l,(l+r)/), build(p*+,(l+r)/+,r), pushup(p);
  67. }
  68.  
  69. void modify(int p,int l,int r,int pos,int k) {
  70. if(l==r) {
  71. a[p]=k;
  72. sq[pos]=k;
  73. }
  74. else {
  75. if(pos<=(l+r)/) modify(p*,l,(l+r)/,pos,k);
  76. else modify(p*+,(l+r)/+,r,pos,k);
  77. pushup(p);
  78. }
  79. }
  80.  
  81. int query(int p,int l,int r,int ql,int qr) {
  82. if(l>qr||r<ql) return ;
  83. if(l>=ql&&r<=qr) return a[p];
  84. return max(query(p*,l,(l+r)/,ql,qr),query(p*+,(l+r)/+,r,ql,qr));
  85. }
  86.  
  87. void readin() {
  88. scanf("%d",&n);
  89. for(int i=;i<n;i++) {
  90. scanf("%d%d%d",&t1,&t2,&t3);
  91. eg1[i]=t1;
  92. eg2[i]=t2;
  93. g[t1].push_back(make_pair(t2,t3));
  94. g[t2].push_back(make_pair(t1,t3));
  95. }
  96. }
  97.  
  98. void init() {
  99. dep[]=;
  100. dfs1();
  101. memset(vis,0x00,sizeof vis);
  102. dfs2();
  103. lca_presolve();
  104. for(int i=;i<=n;i++)
  105. sq[i]=val[tid[i]];
  106. build(,,n);
  107. }
  108.  
  109. void tmodify(int pos,int key){
  110. modify(,,n,sid[pos],key);
  111. }
  112.  
  113. int lquery(int anc,int son) {
  114. int ans=;
  115. while(dep[top[son]]>dep[anc])
  116. ans=max(ans,query(,,n,sid[top[son]],sid[son])),
  117. son=fa[top[son]][];
  118. ans=max(ans,query(,,n,sid[anc]+,sid[son]));
  119. return ans;
  120. }
  121.  
  122. int tquery(int p,int q) {
  123. int l=lca(p,q);
  124. return max(lquery(l,p),lquery(l,q));
  125. }
  126.  
  127. int main(){
  128. readin();
  129. init();
  130. for(int i=;;i++) {
  131. scanf("%s",&str);
  132. if(str[]=='D') return ;
  133. scanf("%d%d",&t2,&t3);
  134. if(str[]=='C') tmodify((dep[eg1[t2]]>dep[eg2[t2]])?eg1[t2]:eg2[t2],t3);
  135. else printf("%d\n",tquery(t2,t3));
  136. }
  137. }

Qtree1 - 树链剖分的更多相关文章

  1. 洛谷 P4114 Qtree1 树链剖分

    目录 题面 题目链接 题目描述 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例: 输出样例: 说明 说明 思路 Change Query AC代码 总结 题面 题目链接 P4114 Qt ...

  2. 洛谷.4114.Qtree1(树链剖分)

    题目链接 模板题都错了这么多次.. //边权赋到点上 树剖模板 //注意LCA.链的顶端不能统计到答案! #include <cstdio> #include <cctype> ...

  3. 树链剖分好(du)题(liu)选做

    1.luogu P4315 月下"毛景树" 题目链接 前言: 这大概是本蒟蒻A掉的题里面码量最大的一道题了.我自认为码风比较紧凑,但还是写了175行. 从下午2点多调到晚上8点.中 ...

  4. BZOJ 3626: [LNOI2014]LCA [树链剖分 离线|主席树]

    3626: [LNOI2014]LCA Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2050  Solved: 817[Submit][Status ...

  5. BZOJ 1984: 月下“毛景树” [树链剖分 边权]

    1984: 月下“毛景树” Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 1728  Solved: 531[Submit][Status][Discu ...

  6. codevs 1228 苹果树 树链剖分讲解

    题目:codevs 1228 苹果树 链接:http://codevs.cn/problem/1228/ 看了这么多树链剖分的解释,几个小时后总算把树链剖分弄懂了. 树链剖分的功能:快速修改,查询树上 ...

  7. 并查集+树链剖分+线段树 HDOJ 5458 Stability(稳定性)

    题目链接 题意: 有n个点m条边的无向图,有环还有重边,a到b的稳定性的定义是有多少条边,单独删去会使a和b不连通.有两种操作: 1. 删去a到b的一条边 2. 询问a到b的稳定性 思路: 首先删边考 ...

  8. 树链剖分+线段树 CF 593D Happy Tree Party(快乐树聚会)

    题目链接 题意: 有n个点的一棵树,两种操作: 1. a到b的路径上,给一个y,对于路径上每一条边,进行操作,问最后的y: 2. 修改某个条边p的值为c 思路: 链上操作的问题,想树链剖分和LCT,对 ...

  9. 树链剖分+线段树 HDOJ 4897 Little Devil I(小恶魔)

    题目链接 题意: 给定一棵树,每条边有黑白两种颜色,初始都是白色,现在有三种操作: 1 u v:u到v路径(最短)上的边都取成相反的颜色 2 u v:u到v路径上相邻的边都取成相反的颜色(相邻即仅有一 ...

随机推荐

  1. cir from c# 托管堆和垃圾回收

    1,托管堆基础 调用IL的newobj 为资源分配内存 初始化内存,设置其初始状态并使资源可用.类型的实列构造器负责设置初始化状态 访问类型的成员来使用资源 摧毁状态进行清理 释放内存//垃圾回收期负 ...

  2. django 定时任务 django-crontab 的使用

    成功例子如下图: 1.前言 在做 django 开发需求时,多多少少都会遇到需要定时任务的功能,比如定时执行任务,检查订单之类的.可能是一段时间,比如每隔 10分钟执行一次,也可能是定点时间,比如 1 ...

  3. Android中TimePicker时间选择器的使用和获取选择的时和分

    场景 实现效果如下 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 将布局改 ...

  4. Hadoop架构及集群

    Hadoop是一个由Apache基金会所开发的分布式基础架构,Hadoop的框架最核心的设计就是:HDFS和MapReduce.HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了 ...

  5. [20200211]使用DBMS_SHARED_POOL.MARKHOT与sql_id的计算.txt

    [20200211]使用DBMS_SHARED_POOL.MARKHOT与sql_id的计算.txt --//以前写的,使用DBMS_SHARED_POOL.MARKHOT标记热的sql_id,这样相 ...

  6. php根据字段相识度进行排序查询

    $data = [ [ 'id'=>1, 'title'=>'test内容管理系统', ], [ 'id'=>2, 'title'=>'开源test', ], [ 'id'=& ...

  7. VAE

    Waiting list: basic knowledge: http://adamlineberry.ai/vae-series/vae-code-experiments

  8. 剑指offer-拓展训练-N皇后的问题-全排列

    /* 题目: N皇后的问题. */ /* 思路: 全排列. 声明一个具有N个元素的数组curr,每个下标i(0>i>n)代表行,每个curr[i]代表列,所以初始化为curr[i] = i ...

  9. Magento2 自定义生成日志函数

    /** * @param $info * @param string $file * @return bool */ public function logger($info, $file = &qu ...

  10. Python之filter()函数与替代实现

    介绍 filter(f,x)函数用于过滤序列并返回迭代器,结果保留x中f为True的元素,需要新的序列通过list()转换. 例子 过滤列表中的字符串,保留数字. >>> i = [ ...