L - 芜湖塔台请求起飞

题目大意

给出一棵大小为 n n n的树,有如下操作:

  • 更改一个节点的权值
  • 查询从x到y路径上的权值和
  • 查询从x到y路径上的最大权值

题解

如果是在一个序列中,上面的操作非常容易用线段树来完成,但是在树上并不能。

于是就要想一个办法使得树变成一个序列。

很显然,就是树链剖分。

利用倍增求LCA,然后分别就是从x到LCA与从y到LCA的答案。

修改操作就直接在线段树上完成。

时间复杂度

线段树上一次查询的复杂度是 O ( log ⁡ n ) O(\log n) O(logn)的,

因为重边是连在 d f n dfn dfn一起的,可以一起查询,于是查询的次数就取决于轻边的次数。

根据重边的性质,可以知道,向下每走过一条轻边,子树大小至少减半,

那么最多走过的轻边数量就是 l o g n log_n logn​。

所以总的时间复杂度是 O ( q × log ⁡ 2 n ) O(q\times \log^2 n) O(q×log2n)。

Tag

树链剖分

线段树

倍增LCA

code

//#pragma GCC optimize (2)
//#pragma G++ optimize (2)
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>
#define G getchar
#define ls(x) (x << 1)
#define rs(x) (x << 1 | 1)
#define mx(x) a[x].mx
#define s(x) a[x].s
using namespace std;int read()
{char ch;for(ch = G();(ch < '0' || ch > '9') && ch != '-';ch = G());int n = 0 , w;if (ch == '-'){w = -1;ch = G();} else w = 1;for(;'0' <= ch && ch <= '9';ch = G())n = (n<<1)+(n<<3)+ch-48;return n * w;
}const int N = 30005;
int dfn [N] , son[N] , tot , n , m , fa [16] [N] , x , y , dep [N];
int nxt [ N << 1] , lst [N] , to [N << 1] , si [N] , v [N] , top [N];
int opv , opl , opr , opt , pos;struct node
{int mx , s;
}a[N << 2];void dfs_1 (int x)
{si [x] = 1;for (int i = lst [x] ; i ; i = nxt [i]){if (to [i] ^ fa [0] [x]){fa [0][ to[i] ] = x;dfs_1(to[i]);si[x] += si[to[i]];if (si[to[i]] > si[son[x]]) son[x] = to[i];}}
}void dfs_2 (int x)
{dep[x] = dep[fa[0][x]] + 1;dfn [x] = ++ tot;if (son[x]){top[son[x]] = top[x];dfs_2(son[x]);}for (int i = lst [x] ; i ; i = nxt [i])if (dfn[to[i]] == 0){top[to[i]] = to[i];dfs_2(to[i]);}
}int lca (int x , int y)
{if (dep[x] < dep[y]) swap(x , y);for (int i = 15 ; i >= 0 ; i--)if (dep[fa[i][x]] >= dep[y]) x = fa[i][x];for (int i = 15 ; i >= 0 ; i--)if (fa[i][x] ^ fa[i][y]){x = fa[i][x];y = fa[i][y];}if (x ^ y) return fa[0][x];else return x;
}void ins (int x , int y)
{nxt[++tot] = lst[x];to[tot] = y;lst[x] = tot;
}void updata (int x)
{mx(x) = max(mx(ls(x)) , mx(rs(x)));s(x) = s(ls(x)) + s(rs(x));
}void work (int x , int l , int r)
{if (opl <= l && r <= opr){switch (opt){case 1:{mx(x) = s(x) = opv;break;}case 2:{opv = opv + s(x);break;}case 3:{opv = max(opv , mx(x));break;}}return;}int m = (l + r) >> 1;if (opl <= m) work(ls(x) , l , m);if (m < opr) work(rs(x) , m + 1 , r);updata(x);
}void calc (int x , int y)
{for (; dep[top[x]] > dep[y] ;){opl = dfn[top[x]];opr = dfn[x];work(1 , 1 , n);x = fa[0][top[x]];}opl = dfn[y];opr = dfn[x];work(1 , 1 , n);
}int main()
{freopen("l.in","r",stdin);//freopen("l.out","w",stdout);n = read();for (int i = 1; i < n; ++i){x = read();y = read();ins (x , y);ins (y , x);}dfs_1(1);for (int i =1 ; i < 16; i++)for (int j = 1 ; j <= n ; j++)fa[i][j] = fa[i - 1][fa[i - 1][j]];tot = 0;top[1] = 1;dfs_2(1);opt = 1;for (int i = 1 ; i <= n ; i++){opv = read();opl = opr = dfn[i];v[i] = opv;work(1 , 1 , n);}m = read();for (int i = 0; i < m; ++i){opt = read();x = read();y = read();pos = lca(x , y);if (opt == 1){opl = opr = dfn[x];opv = y;v[x] = y;work(1 , 1 , n);}else{if (opt == 2) opv = -v[pos]; else opv = v[pos];calc(x , pos);calc(y , pos);printf("%d\n", opv);}}return 0;
}

L - 芜湖塔台请求起飞相关推荐

  1. HTTP最常见的请求头

    HTTP最常见的请求头如下: l         Accept:浏览器可接受的MIME类型: l         Accept-Charset:浏览器可接受的字符集: l         Accept ...

  2. PhalAPI学习笔记 ——— 第二章接口服务请求

    PhalAPI学习笔记 --- 第二章接口服务请求 前言 接口服务请求 接口服务请求案例 自定义接口路由 开启匹配路由 配置路由规则 nginx apache 服务请求 结束语 前言 公司业务需要转学 ...

  3. http请求工具详解

    curl使用方法 参数 说明 例子 -A 设置user-agent curl -A "Chrome" http://www.baidu.com -X 用执行方法请求 curl -X ...

  4. Android 利用原生java发送POST请求json参数(可提交大量数据)

    1.请求工具类 package zjhj.com.myapplication.http.base;import android.os.Handler; import android.os.Messag ...

  5. go语言封装http请求工具类(访问外部接口)

    代码 // example: http://host:port/uri/?param1=1&param2=2 func Get(reqUrl string, jsonParams interf ...

  6. 学了C语言,如何利用CURL写一个下载程序?—用nmake编译CURL并安装

    在这一系列的前一篇文章学了C语言,如何为下载狂人写一个磁盘剩余容量监控程序?中,我们为下载狂人写了一个程序来监视磁盘的剩余容量,防止下载的东西撑爆了硬盘.可是,这两天,他又抱怨他的下载程序不好用,让我 ...

  7. 基于JAVA的机场航班起降与协调管理系统(论文+PPT+源码)

    毕业设计(论文)任务书 第1页 毕业设计(论文)题目:基于JAVA的机场航班起降与协调管理系统毕业设计(论文)要求及原始数据(资料):1.综述机场航班调度对于飞行安全的背景和意义:2.深入了解机场航班 ...

  8. C919背后的中国IT力量

    C919大型客机成功首飞,让全民关注,举国振奋.想知道C919总体结构是如何借助知识自动化平台设计出来的吗?想知道C919未来的国产发动机设计仿真需怎样的高性能计算平台吗?想知道C919哪些部件是用3 ...

  9. 将动态aspx页面转换成为静态html页面的几种方法

    1.         模版法 该方法历史悠久,具体处理流程为采用一个html模版,将其中的关键字替换为我们希望的信息. 优点: 缺点: 所有的信息都要采取字符串批凑的方式来实现,比如需要一个列表,就需 ...

最新文章

  1. EF6 在原有数据库中使用 CodeFirst 总复习(四、新建实体对象)
  2. c语言力扣l最大矩形,leetcode 84柱状图中最大的矩形,利用单调栈求解l
  3. 计算机组成解疑补漏之SDR、DDR及相关计算
  4. python:beautifulSoup学习(来自学习资料)
  5. progress组件(进度条)
  6. 基础001_Xilinx V7资源
  7. c语言sizeof测量字符组长度,C语言中,当计算字符数组长度时,用sizeof 和strlen 的原理及两者的区别...
  8. matlab 中sumg,MATLAB)课后实验答案[1]
  9. CITRIX环境下无法打印原因方法
  10. 【BZOJ】【2730】【HNOI2012】矿场搭建
  11. python画折线图参数配置
  12. Python3抓取糗百、不得姐、kanqu.com
  13. 单片机系统中实用的按键驱动(STM32、51都适用)
  14. c++项目开发——吃豆子游戏
  15. 值得推荐的Idea十几大优秀插件
  16. Java培训后如何找工作?
  17. java的listroots_Java File listRoots()用法及代码示例
  18. 【Linux 主机ssh远程连接暴力破解详解】
  19. 关于sql语句左连接(右连接)与条件同时存在的总结
  20. 计算机视觉那些事 | 深度学习基础篇

热门文章

  1. BootstrapBlazor实战 Menu 导航菜单使用(2)
  2. 电商兴头上的丁磊请注意,阿里云在用AI养猪了
  3. 手写汉字笔顺轨迹提取(已开源)
  4. ubuntu compiz 不能启动
  5. springMvc视图解析器作用
  6. html改游戏聊天字体颜色,html点击按钮改变字体颜色怎么实现
  7. 读书笔记之智识分子(万维钢)
  8. OCO-2卫星数据批量化下载教程
  9. Docker service命令详解
  10. 想知道未来孩子长相?Python人脸融合告诉你