LightOJ 1348 Aladdin and the Return Journey
题意:
给出N个节点的一棵树,每个节点有一个权值。
有两种操作:
1) 0 i j, 问节点i->节点j的路上的总权值。
2) 1 i v, 把节点i的权值改变成v。
思路:
权值在点上的树链剖分+线段树单点更新+线段树成段询问
1 #include <iostream> 2 #include <cstring> 3 #include <string> 4 #include <cstdio> 5 #include <vector> 6 using namespace std; 7 int n, q; 8 #define maxn 30010 9 #define lson l, m, rt<<1 10 #define rson m+1, r, rt<<1|1 11 int siz[maxn], top[maxn], fa[maxn], son[maxn], dep[maxn]; 12 int w[maxn], fw[maxn]; 13 int A[maxn]; 14 vector <int> mp[maxn]; 15 int pos; 16 int sum[maxn<<2]; 17 void PushUp(int rt) 18 { 19 sum[rt] = sum[rt<<1] + sum[rt<<1|1]; 20 } 21 void build(int l, int r, int rt) 22 { 23 sum[rt] = 0; 24 if(l == r) 25 { 26 sum[rt] = A[fw[l]]; 27 return; 28 } 29 int m = (l+r)>>1; 30 build(lson); 31 build(rson); 32 PushUp(rt); 33 } 34 void update(int p, int val, int l, int r, int rt) 35 { 36 if(l == r) 37 { 38 sum[rt] = val; 39 return; 40 } 41 int m = (l+r)>>1; 42 if(p <= m) update(p, val, lson); 43 else update(p, val, rson); 44 PushUp(rt); 45 } 46 int query_sum(int L, int R, int l, int r, int rt) 47 { 48 if(L <= l && R >= r) 49 { 50 return sum[rt]; 51 } 52 int m = (l+r)>>1; 53 int ret = 0; 54 if(L <= m) ret += query_sum(L, R, lson); 55 if(R > m) ret += query_sum(L, R, rson); 56 return ret; 57 } 58 int dfs1(int u, int pre, int deep) 59 { 60 siz[u] = 1; dep[u] = deep; fa[u] = pre; 61 int mmax = 0; 62 for(int i = 0; i < mp[u].size(); i++) 63 { 64 if(mp[u][i] != pre) 65 { 66 int temp = dfs1(mp[u][i], u, deep+1); 67 siz[u] += temp; 68 if(son[u] == -1 || temp >= mmax) 69 { 70 son[u] = mp[u][i]; 71 mmax = temp; 72 } 73 } 74 } 75 return siz[u]; 76 } 77 void dfs2(int u, int val) 78 { 79 top[u] = val; 80 if(son[u] != -1) 81 { 82 w[u] = ++pos; 83 fw[w[u]] = u; 84 dfs2(son[u], val); 85 } 86 else if(son[u] == -1) 87 { 88 w[u] = ++pos; 89 fw[w[u]] = u; 90 return; 91 } 92 for(int i = 0; i < mp[u].size(); i++) 93 { 94 if(mp[u][i] != son[u] && mp[u][i] != fa[u]) dfs2(mp[u][i], mp[u][i]); 95 } 96 } 97 int find_sum(int u, int v) 98 { 99 int f1 = top[u], f2 = top[v]; 100 int temp = 0; 101 while(f1 != f2) 102 { 103 if(dep[f1] < dep[f2]) 104 { 105 swap(f1, f2); 106 swap(u, v); 107 } 108 temp += query_sum(w[f1], w[u], 1, pos, 1); 109 u = fa[f1]; f1 = top[u]; 110 } 111 if(dep[u] > dep[v]) swap(u, v); 112 temp += query_sum(w[u], w[v], 1, pos, 1); 113 return temp; 114 } 115 int main() 116 { 117 // freopen("in.txt", "r", stdin); 118 int T; 119 scanf("%d", &T); 120 int cast = 0; 121 while(T--) 122 { 123 scanf("%d", &n); 124 cast++; 125 for(int i = 1; i <= n; i++) mp[i].clear(); 126 pos = 0; 127 memset(son, -1, sizeof(son)); 128 for(int i = 1; i <= n; i++) scanf("%d", &A[i]); 129 for(int i = 1; i <= n-1; i++) 130 { 131 int a, b; scanf("%d%d", &a, &b); 132 a++; b++; 133 mp[a].push_back(b); 134 mp[b].push_back(a); 135 } 136 dfs1(1, -1, 1); 137 dfs2(1, 1); 138 build(1, pos, 1); 139 140 scanf("%d", &q); 141 int op; 142 printf("Case %d:\n", cast); 143 while(q--) 144 { 145 scanf("%d", &op); 146 int u, v; 147 scanf("%d%d", &u, &v); 148 if(op == 1) update(w[u+1], v, 1, pos, 1); 149 else if(op == 0) printf("%d\n", find_sum(u+1, v+1)); 150 } 151 152 } 153 return 0; 154 }
转载于:https://www.cnblogs.com/titicia/p/4902468.html
LightOJ 1348 Aladdin and the Return Journey相关推荐
- LightOJ - 1341 Aladdin and the Flying Carpet(数论)
题意 有一块矩形(也可能是正方形)的飞毯. 给定飞毯的面积\(n\)和最小可能的边长\(a\),求可能有多少种不同边长的飞毯.(\(1<=a<=n<=1e12\)) 如面积\(n=6 ...
- 树链剖分入门——[kuangbin]树链剖分
树链剖分的本质就是将一棵树拆分成一段一段连续的区间,然后放在一起就可以用一棵单独的线段树处理区间问题,只需要将树上节点和线段树节点的对应关系求好就可以很方便的互相转换,而树上两点之间路径的相关问题就可 ...
- English Learning - L3 Lesson6 NCE2-Dead Return 译文
嚼碎新概念 (第二册 L96) A Festival for the Dead is held once a year in Japan. 在日本每年都要举行一次亡灵节. This festival ...
- kuangbin带你飞专题合集
题目列表 [kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题二 搜索进阶 [kuangbin带你飞]专题三 Dancing Links [kuangbin带你飞]专题四 最短路 ...
- 算法学习经典例题整理
陆续会对本篇博客进行更新! 搜索:https://vjudge.net/contest/292597 区间DP:https://vjudge.net/contest/293892 树状背包:https ...
- [kuangbin]各种各样的题单
[kuangbin]各种各样的题单 专题1 简单搜索 POJ 1321 POJ 2251 POJ 3278 POJ 3279 POJ 1426 POJ 3126 POJ 3087 POJ 3414 F ...
- 电话号码的判断--使用正则表达式的示例
code copy from http://blog.csdn.net/kwklover/archive/2005/01/12/250326.aspx thanks to kwklover 怕忘了所 ...
- 新概念英语第二册61-96课(转)
Lesson 61 Trouble with the Hubble哈勃望远镜的麻烦 1.哈勃望远镜The Hubble telescope被发射到太空was launched into spac ...
- Three.JS游戏开发入门
就在不久前,创建和部署游戏的唯一方法是选择像 Unity 或 Unreal 这样的游戏引擎,学习语言,然后打包游戏并将其部署到你选择的平台上. 试图通过浏览器向用户提供游戏的想法似乎是一项不可能完成的 ...
最新文章
- 可逼近信道容量编码技术之霍夫曼编码的实现
- 前端:JS中JSON对象和String转换
- 运筹学最优化理论系列概念-单纯形法原理解析
- 开启ntp服务_Linux入门:Linux自有服务及软件包
- opencv java 摄像头_使用OpenCV Java创建Windows摄像头扫码程序
- html安卓关闭输入面板,tabletpc输入面板关闭不了怎么办(tablet pc输入面板关闭方法)...
- web工程导入MyEclipse 就变成Java工程 ———— 解决方案
- 二分查找基础概念与经典题目(Leetcode题解-Python语言)二分数值型
- java中字符串的精确匹配_Java最佳实践–字符串性能和精确字符串匹配
- 什么是嵌入式工程师,发展前景如何
- oracle里查询表的语句,Oracle查询用户所有表的语句
- 微信开放平台应用申请
- SharePoint 内容编辑器部件介绍
- 三步搞定Origin双误差棒画法!
- 知网等数据库文献快速直接导入EndNote的方法
- 实时时钟(RTC)的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- 字节跳动后端面经(17)
- ecshop 要求php,使用ecshop需要什么环境才可以运行
- solr php 中文分词,solr分词以及搜索
- C++lambda 捕获
热门文章
- 【Java Web开发指南】Mybatis 中的延迟加载
- python基础练习(六)
- ddl mysql_mysql 5.6 在线 DDL
- 郑州升达学院计算机考试,第35次全国计算机等级考试报名工作通知
- java numberutil_NumberUtil
- python 系统当前时间向前推2天_python 练习 后台返回当前时间
- okl4 linux,Native OKL4 Android Stack
- java openoffice 打印_java调用openoffice将office系列文档转换为PDF的示例方法
- 什么是网络推广浅析如何提高搜索引擎的抓取频次?
- 如何优化才能赢得搜索引擎“欢心”,提升抓取量?