题目链接: P1505 [国家集训队]旅游

大致题意

给定一棵nnn个节点的树, 边带权, 编号 000 ~ n−1n - 1n−1, 需要支持五种操作:

C i w 将输入的第iii条边权值改为www
N u v 将u,vu, vu,v节点之间的边权都变为相反数
SUM u v 询问u,vu, vu,v节点之间边权和
MAX u v 询问u,vu, vu,v节点之间边权最大值
MIN u v 询问u,vu, vu,v节点之间边权最小值

保证任意时刻所有边的权值都在 [−1000,1000][-1000, 1000][−1000,1000] 内。

解题思路

树链剖分 这不是树剖裸题吗?

我们首先需要把树中边权化为点权, 然后在线段树内维护区间和, 区间最大值, 区间最小值, 区间取反懒标记即可.

AC代码

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 1; i <= (n); ++i)
using namespace std;
typedef long long ll;
const int N = 2E5 + 10, INF = 0x3f3f3f3f;
int w[N]; //给定的树中各个顶点的权值
struct EDGE { int a, b, c; }EG[N];
vector<int> edge[N]; //树上各个点之间的边int p[N], dep[N], sz[N], son[N];
// 父节点   深度   节点大小 重儿子
void dfs1(int x = 1, int fa = 0) { // x = 树根节点p[x] = fa, dep[x] = dep[fa] + 1, sz[x] = 1; // son[x] = 0;for (auto& to : edge[x]) {if (to == fa) continue;dfs1(to, x);sz[x] += sz[to];       // 特别的, 如果边权->点权, 应记录w[to] = 边权.if (sz[to] > sz[son[x]]) son[x] = to; //更新重儿子}
}
int id[N], nw[N], top[N], ind;
//  新编号  新值    重链顶 当前用到的编号
void dfs2(int x = 1, int tp = 1) { // x = 树根节点, tp = 树根节点id[x] = ++ind, nw[ind] = w[x], top[x] = tp;if (!son[x]) return; //叶子结点dfs2(son[x], tp); //先遍历重儿子for (auto& to : edge[x]) {if (to == p[x] or to == son[x]) continue;dfs2(to, to);}
}struct node {int l, r;int sum, fmax, fmin;int flag; // 1
}t[N << 2];
void pushdown(node& op, int) {op.sum = -op.sum;op.fmax = -op.fmax, op.fmin = -op.fmin, swap(op.fmax, op.fmin);op.flag *= -1;
}
void pushdown(int x) {if (t[x].flag == 1) return;pushdown(t[x << 1], 1), pushdown(t[x << 1 | 1], 1);t[x].flag = 1;
}void pushup(node& p, node& l, node& r) {p.sum = l.sum + r.sum;p.fmax = max(l.fmax, r.fmax), p.fmin = min(l.fmin, r.fmin);
}
void pushup(int x) { pushup(t[x], t[x << 1], t[x << 1 | 1]); }void build(int l, int r, int x = 1) {t[x] = { l, r, nw[l], nw[l], nw[l], 1 };if (l == r) return;int mid = l + r >> 1;build(l, mid, x << 1), build(mid + 1, r, x << 1 | 1);pushup(x);
}void modify(int l, int r, int c, int x = 1) {if (l <= t[x].l and r >= t[x].r) {if (c == INF) pushdown(t[x], 1);else t[x].sum = t[x].fmax = t[x].fmin = c;return;}pushdown(x);int mid = t[x].l + t[x].r >> 1;if (l <= mid) modify(l, r, c, x << 1);if (r > mid) modify(l, r, c, x << 1 | 1);pushup(x);
}node ask(int l, int r, int x = 1) {if(l <= t[x].l and r >= t[x].r) return t[x];pushdown(x);int mid = t[x].l + t[x].r >> 1;if (r <= mid) return ask(l, r, x << 1);if (l > mid) return ask(l, r, x << 1 | 1);node left = ask(l, r, x << 1), right = ask(l, r, x << 1 | 1);node res = { left.l, right.r }; pushup(res, left, right);return res;
}void modify_route(int a, int b) {while (top[a] != top[b]) {if (dep[top[a]] < dep[top[b]]) swap(a, b);modify(id[top[a]], id[a], INF);a = p[top[a]];}if (a == b) return;if (id[a] > id[b]) swap(a, b);modify(id[son[a]], id[b], INF);
}node ask_route(int a, int b) {node res = { 0, 0, 0, INT_MIN, INT_MAX, 1 };while (top[a] != top[b]) {if (dep[top[a]] < dep[top[b]]) swap(a, b);node qaq = ask(id[top[a]], id[a]);res.fmax = max(res.fmax, qaq.fmax), res.fmin = min(res.fmin, qaq.fmin);res.sum += qaq.sum;a = p[top[a]];}if (a == b) return res;if (dep[a] > dep[b]) swap(a, b);node qaq = ask(id[son[a]], id[b]);res.fmax = max(res.fmax, qaq.fmax), res.fmin = min(res.fmin, qaq.fmin);res.sum += qaq.sum;return res;
}
int main()
{int n; cin >> n;rep(i, n - 1) {int a, b, c; scanf("%d %d %d", &a, &b, &c); a++, b++;edge[a].push_back(b), edge[b].push_back(a);EG[i] = { a, b, c };}dfs1();rep(i, n - 1) {auto& [a, b, c] = EG[i];if (dep[a] < dep[b]) swap(a, b);w[a] = c;}dfs2();build(1, n);int m; cin >> m;rep(i, m) {char s[5]; scanf("%s", s);if (*s == 'C') {int x, c; scanf("%d %d", &x, &c);int a = EG[x].a;modify(id[a], id[a], c);}else if (*s == 'N') {int a, b; scanf("%d %d", &a, &b); a++, b++;modify_route(a, b);}else {int a, b; scanf("%d %d", &a, &b); a++, b++;auto qaq = ask_route(a, b);if (*s == 'S') printf("%d\n", qaq.sum);else if (s[1] == 'A') printf("%d\n", qaq.fmax);else printf("%d\n", qaq.fmin);}}return 0;
}

END

P1505 [国家集训队]旅游 (树链剖分)相关推荐

  1. P1505 [国家集训队]旅游 树链剖分

    题目链接 题意:树上更新某一点权值,更新两点简单路径权值,查询最大,最小,和 思路:思路应该比较简单,就是树链剖分后用线段树维护区间最大最小以及区间和. 但是本题比较特殊的是给的边权,转化为点权即可. ...

  2. ⌈洛谷1505⌋⌈BZOJ2157⌋⌈国家集训队⌋旅游【树链剖分】

    题目链接 [洛谷] [BZOJ] 题目描述 Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T ...

  3. BZOJ 2157 「国家集训队」旅游(树链剖分,线段树,边权转点权)【BZOJ计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2157 是 hydro 的 BZOJ ...

  4. bzoj 3999: [TJOI2015]旅游(树链剖分)

    3999: [TJOI2015]旅游 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 423  Solved: 214 [Submit][Status ...

  5. 【树链剖分】旅游(luogu 3976)

    正题 luogu 3976 题目大意 给你一棵树,每个点有一个权值s 现在给你一条路径,让你选择两个点x,y,使y在x后面,且sy−sxs_y-s_xsy​−sx​最大 然后该路劲上所有点权值加v 解 ...

  6. 【BZOJ2157】旅游,树链剖分练习

    传送门 写在前面:模拟赛中CA爷卡我内存,暴力100变60--不过还是亲学长(毕竟在我初中的时候就是学长),每次做CA爷的题都是高分-- 思路: (迄今做的最爽的树链剖分) 被char哥带着做这道题, ...

  7. 【暖*墟】#树链剖分# 树链剖分学习与练习

    树链剖分 树链剖分是一种优化,将树上最常经过的几条链划为重点,用线段树来优化区间修改和查询. 并且因为在一棵子树中dfs序是连续的,并且在任意一条重链上,dfs序也是连续的, 可以认为轻链是单点修改, ...

  8. ACdream 1103 瑶瑶正式成为CEO(树链剖分+费用流)

    Problem Description 瑶瑶(tsyao)是某知名货运公司(顺丰)的老板,这个公司很大,货物运输量极大,因此公司修建了许多交通设施,掌控了一个国家的交通运输. 这个国家有n座城市,公司 ...

  9. BZOJ 1146: [CTSC2008]网络管理Network( 树链剖分 + 树状数组套主席树 )

    树链剖分完就成了一道主席树裸题了, 每次树链剖分找出相应区间然后用BIT+(可持久化)权值线段树就可以完成计数. 但是空间问题很严重....在修改时不必要的就不要新建, 直接修改原来的..详见代码. ...

  10. 【bzoj1146】 [CTSC2008]网络管理Network【树链剖分+树套树+二分 线段树套Treap】

    1146: [CTSC2008]网络管理Network Description M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公 ...

最新文章

  1. kettle全量抽数据_漫谈数据平台架构的演化和应用
  2. android x86 vulkan,【图片】预告贴,准备同步AndroidIA源码,貌似支持Vulkan【androidx86吧】_百度贴吧...
  3. Java中对POI的单元格设置背景色
  4. java schema名_关于Schema的名字空间
  5. Taro+react开发(65):h5全局重置背景样式
  6. ElasticSearch映射Mapping
  7. 【Siddhi】Siddhi 组件架构
  8. XML解析:PULL解析
  9. 计算机html二级难度,计算机二级考试越来越难的实锤!真实数据告诉你到底难在哪里?...
  10. Spring Boot @Transactional 配置事务管理
  11. echarts使用_做数据可视化,为什么我们不再直接使用D3.js、Echarts
  12. springboot+jsp小说在线阅读系统-java原创文学网
  13. 局域网文件服务器单独文件夹加密,局域网 如何给共享文件夹加密
  14. 台式计算机怎么关闭无线网络,台式机无线网卡如何关闭
  15. allpairs工具的使用
  16. 为什么现代物理学离不开量子论和相对论?
  17. 使用EFI安装win7-64位,在不能使用U盘的情况下
  18. 【渝粤题库】广东开放大学 形成性考核 - 副本 (11)
  19. 基于Matlab遗传算法工具箱解决物流中心选址
  20. 构造二叉树-前序遍历

热门文章

  1. 植被覆盖度时空变化规律分析实例
  2. W10虚拟机一开机电脑蓝屏重启
  3. 自定义PPT背景的大小
  4. 单细胞分析实录(18): 基于CellPhoneDB的细胞通讯分析及可视化 (上篇)
  5. pygame中的mixer(含music)模块
  6. Collecting stars
  7. react引入html2canvas和jspdf生成PDF打印及下载
  8. php+mysql+jquery瀑布流
  9. python 日期 格式转换 英文_python中各种时间格式的转换
  10. soul群聊派对显示服务器异常,soul群聊派对在哪?功能、查找步骤有这些