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

相关文章

HDU 1392 HDU 1348 凸包

求凸包的周长,  注意n=1 , 2时特殊情况 int cmp(double x){if(fabs(x) < 1e-8) return 0 ;if(x > 0) return 1 ;return -1 ;}struct point{double x , y ;point(){}point(double _x , double _y):x(_x) , y(_y){}frien

try -catch-finally的理解,同时在try-catch-finally中含有return和throws的理解

在没有try-catch或try-catch-finally的情况下,程序正常执行到某行,在这行报错后,这行后面的代码就不执行了,程序就停止了,中断了。 例如   在有try-catch或try-catch-finally 情况上,在某行执行错误,在try中这行下的代码不执行,try外的代码执行。当然是catch在没有做处理的情况下。如果catch中做了处理,在不影响当前程序下,try

哈理工OJ 2179(深搜)

组合 Time Limit: 1000 MSMemory Limit: 32768 K Total Submit: 7(5 users)Total Accepted: 6(5 users)Rating: Special Judge: No Description 给出一个正整数N,从集合{1,2,3..N} 中找出所有大小为k的子集, 并按照字典序从小到大输出。 Input 第一行是一个整

每日OJ_牛客_求和(递归深搜)

目录 牛客_求和(递归深搜) 解析代码 牛客_求和(递归深搜) 求和_好未来笔试题_牛客网 解析代码         递归中每次累加一个新的数,如果累加和大于等于目标,结束递归。此时如果累加和正好等于目标,则打印组合。向上回退搜索其它组合。此题本身就是一个搜索的过程,找到所有的组合。 #include <iostream>#include <cmath>#in

王立平--AES加密图片实现 SkImageDecoder::Factory return null

这个问题是在加密图片,存入sd卡,在解密出来展示,出现的。我个人研究了很久没解决。最后经过高人指点,终于解决了。 在此,拿出来分享,希望各位少走弯路。 我之前的设计思路是:(可以不看哦) 1.把图片从drawable读入成bitmap 2.bitmap-->byte 3.调用AES的byte加密算法。 4.加密成byte,在转化为string 5,把string存入sd卡。

OJ-0905

题目 示例1: 输入:10 10 56 34 99 1 87 8 99 3 255 6 99 5 255 4 99 7 255 2 99 9 255 213 4输出:99 示例2: 输入:10 10 255 34 0 1 255 8 0 3 255 6 0 5 255 4 0 7 255 2 0 9 255 213 5输出:255 import java.util.

关于No resource found that matches the given name 'Theme.AppCompat.Light' No resource found that ma

关于No resource found that matches the given name  'Theme.AppCompat.Light' No resource found that matches the given name   'android:Widget.Material.ActionButton.CloseMode'. 我的上一遍文章 http://blog.csdn.net

VS2013 + QT5.7.0静态编译 错误 .NMAKE:fatal error U1077. return code 0x2,使用 类 模板 需要 模板 参数列表

最近准备搞下QT,早有耳闻,QT的动态库机制让QT的程序大的无比,这我肯定是不能容忍的,准备使用静态库的方式,那就编译源码吧! 下面我说下环境以及碰到的问题 文章参考了http://blog.csdn.net/u011964923/article/details/52886908 ,但是我的报错了。。。下面是解决. 1.环境问题 1.QT版本 :qt5.7  qt-op

每日OJ_牛客_Emacs计算器(逆波兰表达式)

目录 牛客_Emacs计算器(逆波兰表达式) 解析代码 牛客_Emacs计算器(逆波兰表达式) Emacs计算器__牛客网 解析代码 逆波兰表达式(后缀表达式)求值,需要借助栈,思路: 循环输入,获取逆波兰表达式,然后进行以下补助,直到测试完所有的测试用例: 遇到数字字符串,将该数字字符串转化为数字然后入栈。遇到操作符时,从栈顶取两个数字,然后进行该运算符所对应运算

树链剖分 + 后缀数组 - E. Misha and LCP on Tree

E. Misha and LCP on Tree  Problem's Link   Mean:  给出一棵树,每个结点上有一个字母。每个询问给出两个路径,问这两个路径的串的最长公共前缀。 analyse: 做法:树链剖分+后缀数组. 记录每条链的串,正反都需要标记,组成一个长串. 然后记录每条链对应的串在大串中的位置,对大串求后缀数组,最后询问就是在一些链