Light OJ 1348 - Aladdin and the Return Journey(树链剖分)

2024-06-05 01:58

本文主要是介绍Light OJ 1348 - Aladdin and the Return Journey(树链剖分),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:Light OJ 1348 - Aladdin and the Return Journey

题目大意:给定一棵树,两种操作

  • 0 i j:ij路径上的权值和
  • 1 i v:将第i个节点的权值修改为v

解题思路:树链剖分的裸题。

#include <cstdio>
#include <cstring>
#include <algorithm>using namespace std;const int maxn = 30005;int N, Q, ne, first[maxn], jump[maxn * 2], link[maxn * 2], val[maxn];
int id, idx[maxn], dep[maxn], far[maxn], son[maxn], top[maxn], cnt[maxn];void dfs (int u, int pre, int d) {far[u] = pre;dep[u] = d;son[u] = 0;cnt[u] = 1;for (int i = first[u]; i + 1; i = jump[i]) {int v = link[i];if (v == pre)continue;dfs(v, u, d + 1);cnt[u] += cnt[v];if (cnt[son[u]] < cnt[v])son[u] = v;}
}void dfs(int u, int rot) {top[u] = rot;idx[u] = ++id;if (son[u])dfs(son[u], rot);for (int i = first[u]; i + 1; i = jump[i]) {int v = link[i];if (v == far[u] || v == son[u])continue;dfs(v, v);}
}inline void add_Edge(int u, int v) {link[ne] = v;jump[ne] = first[u];first[u] = ne++;
}#define lson(x) ((x)<<1)
#define rson(x) (((x)<<1)|1)
int lc[maxn << 2], rc[maxn << 2], s[maxn << 2];inline void pushup(int u) {s[u] = s[lson(u)] + s[rson(u)];
}void build (int u, int l, int r) {lc[u] = l;rc[u] = r;s[u] = 0;if (l == r)return;int mid = (l + r) / 2;build(lson(u), l, mid);build(rson(u), mid + 1, r);pushup(u);
}int query(int u, int l, int r) {if (l <= lc[u] && rc[u] <= r)return s[u];int mid = (lc[u] + rc[u]) / 2, ret = 0;if (l <= mid)ret += query(lson(u), l, r);if (r > mid)ret += query(rson(u), l, r);pushup(u);return ret;
}void modify(int u, int x, int v) {if (x == lc[u] && x == rc[u]) {s[u] = v;return;}int mid = (lc[u] + rc[u]) / 2;if (x <= mid)modify(lson(u), x, v);elsemodify(rson(u), x, v);pushup(u);
}void init () {scanf("%d", &N);for (int i = 1; i <= N; i++)scanf("%d", &val[i]);int u, v;ne = id = 0;memset(first, -1, sizeof(first));for (int i = 1; i < N; i++) {scanf("%d%d", &u, &v);u++, v++;add_Edge(u, v);add_Edge(v, u);}dfs(1, 0, 0);dfs(1, 1);build(1, 1, N);for (int i = 1; i <= N; i++)modify(1, idx[i], val[i]);
}int query (int u, int v) {int p = top[u], q = top[v], ret = 0;while (p != q) {if (dep[p] < dep[q]) {swap(p, q);swap(u, v);}ret += query(1, idx[p], idx[u]);u = far[p];p = top[u];}if (dep[u] > dep[v])swap(u, v);ret += query(1, idx[u], idx[v]);return ret;
}int main () {int cas;scanf("%d", &cas);for (int kcas = 1; kcas <= cas; kcas++) {init();scanf("%d", &Q);printf("Case %d:\n", kcas);int k, u, v;while (Q--) {scanf("%d%d%d", &k, &u, &v);if (k)modify(1, idx[u+1], v);elseprintf("%d\n", query(u+1, v+1));}}return 0;
}

这篇关于Light OJ 1348 - Aladdin and the Return Journey(树链剖分)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1031750

相关文章

SPOJ - QTREE (树链剖分)

基础的树链剖分题目,不过是边权,可以向下映射成点权或者按边剖分。 VIEW CODE #include <iostream>#include<stdio.h>#include<cmath>#include<string.h>#include<algorithm>#include<string>using namespace std;const int mmax=100

ORA-12737: Instant Client Light: unsupported server character set CHS16GBK

当使用Navicat Premiun 英文版连接oracl时可能会报ORA-12737: Instant Client Light: unsupported server character set CHS16GBK错误 这是只要打开Navicat Premiun-->tools-->options 把OCI的地址指向oracle安装目录下的oci.dll即可,地址可能不完全相同,我的是在:F:

二叉树经典OJ练习

个人主页:C++忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C++忠实粉丝 原创 二叉树经典OJ练习 收录于专栏【数据结构初阶】 本专栏旨在分享学习数据结构学习的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 前置说明  1. 单值二叉树 2. 相同的树 3. 对称二叉树 4. 二叉树的前序遍历 5. 二叉树中序遍历 6. 二叉树的后序遍历 7. 另一

面试题之final,finally和finalize的区别以及如果catch里面有return语句,请问finally里面的代码还会执行吗?

/*  * 面试题:  * 1:final,finally和finalize的区别  * final:最终的意思,可以修饰类,成员变量,成员方法  *         修饰类,类不能被继承  *         修饰变量,变量是常量  *         修饰方法,方法不能被重写  * finally:是异常处理的一部分,用于释放资源。  *         一般来

unity开发 --------- NGUI (UIButtonColor、TweenColor、Light)

unity开发 --------- NGUI UIButtonColor、TweenColor两个组件可以控制gameobject变色。其中UIButtonColor一般附加在Button上,它是变色事件的发送端。而TweenColor附加在target上,它是变色事件的具体执行单位。 UIButtonColor的属性很简单: public GameObject tweenTa

try...catch...finally块嵌入return

不论C++还是Java中,try...catch...finally语句块都是用来控制程序异常的处理,而finally块是最后一定执行的,那么现在在try...catch...块中加入了return语句,finally仍会执行吗? public class Try_Return_Final {int test(){int x = 1;try{return x;}finally{++x;}}p

Java中的continue、break和return

一、continue结束本次循环,进入下次循环 for(int i=0; i<5; i++){for(int j=0; j<5; j++){if(j == 3) continue;System.out.print("(" + i + "," + j +")"); }System.out.println();}   二、break 1、break终止本次循环 for(i

js中的break,continue,return

转自:  http://blog.sina.com.cn/s/blog_67aaf4440100p3zg.html 谢谢! 面向对象编程语法中我们会碰到break ,continue, return这三个常用的关键字,那么关于这三个关键字的使用具体的操作是什么呢?我们在使用这三关键字的时候需要注意和需要理解的规则是什么呢?让我们开始介绍吧:   js编程语法之break语句: br

不得不看的AI前沿理论与技术: LLM-Assisted Light大模型

文章主要介绍最新论文《LLM-Assisted Light: Leveraging Large Language Model Capabilities for Human-Mimetic Traffic Signal Control in Complex Urban Environments》,该论文提出了一种名为LLM-Assisted Light(LA-Light)的创新方法,利用大型语言模型

[HDU 5029] Relief grain (树链剖分+线段树)

HDU - 5029 其实这道题最大的难点不是树链剖分,而是怎么维护某个点被那些颜色染过,染过多少次 如果在线段树维护的话,很难做到,估计得树套树,而且空间会炸 好在这题是离线的,可以使用差分的思想来维护 对一段区间[l,r]染色 c,相当于在这段区间左端点 l打上 c标志,右端点 r+1打上 -c标志 然后扫一遍整个区间 (依照 dfs序扫一遍整棵树),期间不断维护一颗线段树 线段树