题意:

给出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相关推荐

  1. LightOJ - 1341 Aladdin and the Flying Carpet(数论)

    题意 有一块矩形(也可能是正方形)的飞毯. 给定飞毯的面积\(n\)和最小可能的边长\(a\),求可能有多少种不同边长的飞毯.(\(1<=a<=n<=1e12\)) 如面积\(n=6 ...

  2. 树链剖分入门——[kuangbin]树链剖分

    树链剖分的本质就是将一棵树拆分成一段一段连续的区间,然后放在一起就可以用一棵单独的线段树处理区间问题,只需要将树上节点和线段树节点的对应关系求好就可以很方便的互相转换,而树上两点之间路径的相关问题就可 ...

  3. English Learning - L3 Lesson6 NCE2-Dead Return 译文

    嚼碎新概念 (第二册 L96) A Festival for the Dead is held once a year in Japan. 在日本每年都要举行一次亡灵节. This festival ...

  4. kuangbin带你飞专题合集

    题目列表 [kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题二 搜索进阶 [kuangbin带你飞]专题三 Dancing Links [kuangbin带你飞]专题四 最短路 ...

  5. 算法学习经典例题整理

    陆续会对本篇博客进行更新! 搜索:https://vjudge.net/contest/292597 区间DP:https://vjudge.net/contest/293892 树状背包:https ...

  6. [kuangbin]各种各样的题单

    [kuangbin]各种各样的题单 专题1 简单搜索 POJ 1321 POJ 2251 POJ 3278 POJ 3279 POJ 1426 POJ 3126 POJ 3087 POJ 3414 F ...

  7. 电话号码的判断--使用正则表达式的示例

     code copy from http://blog.csdn.net/kwklover/archive/2005/01/12/250326.aspx thanks to kwklover 怕忘了所 ...

  8. 新概念英语第二册61-96课(转)

    Lesson 61  Trouble with the Hubble哈勃望远镜的麻烦   1.哈勃望远镜The Hubble telescope被发射到太空was launched into spac ...

  9. Three.JS游戏开发入门

    就在不久前,创建和部署游戏的唯一方法是选择像 Unity 或 Unreal 这样的游戏引擎,学习语言,然后打包游戏并将其部署到你选择的平台上. 试图通过浏览器向用户提供游戏的想法似乎是一项不可能完成的 ...

最新文章

  1. 可逼近信道容量编码技术之霍夫曼编码的实现
  2. 前端:JS中JSON对象和String转换
  3. 运筹学最优化理论系列概念-单纯形法原理解析
  4. 开启ntp服务_Linux入门:Linux自有服务及软件包
  5. opencv java 摄像头_使用OpenCV Java创建Windows摄像头扫码程序
  6. html安卓关闭输入面板,tabletpc输入面板关闭不了怎么办(tablet pc输入面板关闭方法)...
  7. web工程导入MyEclipse 就变成Java工程 ———— 解决方案
  8. 二分查找基础概念与经典题目(Leetcode题解-Python语言)二分数值型
  9. java中字符串的精确匹配_Java最佳实践–字符串性能和精确字符串匹配
  10. 什么是嵌入式工程师,发展前景如何
  11. oracle里查询表的语句,Oracle查询用户所有表的语句
  12. 微信开放平台应用申请
  13. SharePoint 内容编辑器部件介绍
  14. 三步搞定Origin双误差棒画法!
  15. 知网等数据库文献快速直接导入EndNote的方法
  16. 实时时钟(RTC)的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  17. 字节跳动后端面经(17)
  18. ecshop 要求php,使用ecshop需要什么环境才可以运行
  19. solr php 中文分词,solr分词以及搜索
  20. C++lambda 捕获

热门文章

  1. 【Java Web开发指南】Mybatis 中的延迟加载
  2. python基础练习(六)
  3. ddl mysql_mysql 5.6 在线 DDL
  4. 郑州升达学院计算机考试,第35次全国计算机等级考试报名工作通知
  5. java numberutil_NumberUtil
  6. python 系统当前时间向前推2天_python 练习 后台返回当前时间
  7. okl4 linux,Native OKL4 Android Stack
  8. java openoffice 打印_java调用openoffice将office系列文档转换为PDF的示例方法
  9. 什么是网络推广浅析如何提高搜索引擎的抓取频次?
  10. 如何优化才能赢得搜索引擎“欢心”,提升抓取量?