hdu Dylans loves tree [LCA] (树链剖分)
Dylans loves tree

view code#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#define REP(i, n) for(int i = 0; i < (n); ++i)
#define FOR(i, a, b) for(int i = (a); i <= (b); ++i)
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
using namespace std;
typedef vector<int > VI;
typedef pair<int, int > PII;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const int N = 100010;
int _, cas=1, n, Q, m, val[N], seg[N << 2]; struct Edge {
int u, v, next;
Edge() {}
Edge(int u, int v, int next):u(u), v(v), next(next) {}
}e[N << 1];
int head[N], ecnt; void add(int u, int v) {
e[ecnt] = Edge(u, v, head[u]);
head[u] = ecnt++;
} int dep[N], fa[N], sz[N], top[N], id[N], fid[N], gid, son[N];
void dfs(int u, int f, int d) {
fa[u] = f, sz[u] = 1, dep[u] = d, son[u] = 0;
for(int i = head[u]; ~i; i = e[i].next) {
int v = e[i].v;
if(v == f) continue;
dfs(v, u, d + 1);
sz[u] += sz[v];
if(sz[ son[u] ] < sz[v]) son[u] = v;
}
} void getpos(int u, int f) {
id[u] = ++gid;
fid[gid] = u;
top[u] = f;
if(!son[u]) return ;
getpos(son[u], f);
for(int i = head[u]; ~i; i = e[i].next) {
int v = e[i].v;
if(v == son[u] || v == fa[u]) continue;
getpos(v, v);
}
} void pushUp(int rt) {
seg[rt] = seg[rt << 1] ^ seg[rt << 1 | 1];
} void build(int l, int r, int rt) {
if(l == r) {
seg[rt] = val[ fid[l] ];
return ;
}
int m = (l + r) >> 1;
build(lson);
build(rson);
pushUp(rt);
} void update(int p, int c, int l, int r, int rt) {
if(l == r) {
seg[rt] = c;
return ;
}
int m = (l + r) >> 1;
if(p <= m) update(p, c, lson);
else update(p, c, rson);
pushUp(rt);
} int query(int L, int R, int l, int r, int rt) {
if(L <= l && R >= r) return seg[rt];
int m = (l + r) >> 1, ans = 0;
if(L <= m) ans ^= query(L, R, lson);
if(R > m) ans ^= query(L, R, rson);
return ans;
} int lca(int u, int v) {
int fu = top[u], fv = top[v], ans = 0, dis = 0;
while(fu != fv) {
if(dep[fu] < dep[fv]) {
swap(fu, fv), swap(u, v);
}
ans ^= query(id[fu], id[u], 1, n, 1);
dis += id[u] - id[fu] + 1;
u = fa[fu];
fu = top[u];
}
if(dep[u] < dep[v]) swap(u, v);
ans ^= query(id[v], id[u], 1, n, 1);
dis += id[u] - id[v] + 1;
return (dis & 1) ? ans : -1;
} void solve() {
scanf("%d%d", &n, &Q); ecnt = 0;
memset(head, -1, sizeof(head[0]) * sizeof(n +5));
int u, v;
REP(i, n - 1) {
scanf("%d%d", &u, &v);
add(u, v);
add(v, u);
}
FOR(i, 1, n) {
scanf("%d", &val[i]);
} sz[0] = 0;
gid = 0;
dfs(1, 1, 0);
getpos(1, 1);
build(1, n, 1); int flag;
while(Q--) {
scanf("%d%d%d", &flag, &u, &v);
if(flag) {
printf("%d\n", lca(u, v));
} else {
update(id[u], v, 1, n, 1);
}
}
} int main()
{
cin >> _;
while(_--) solve();
return 0;
}
hdu Dylans loves tree [LCA] (树链剖分)的更多相关文章
- HDU 5274 Dylans loves tree(树链剖分)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5274 [题目大意] 给出一棵树,每个点有一个权值,权值可修改,且大于等于0,询问链上出现次数为奇数 ...
- poj 3237 Tree [LCA] (树链剖分)
poj 3237 tree inline : 1. inline 定义的类的内联函数,函数的代码被放入符号表中,在使用时直接进行替换,(像宏一样展开),没有了调用的开销,效率也很高. 2. 很明显,类 ...
- hdu 5274 Dylans loves tree(LCA + 线段树)
Dylans loves tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- Count on a tree SPOJ 10628 主席树+LCA(树链剖分实现)(两种存图方式)
Count on a tree SPOJ 10628 主席树+LCA(树链剖分实现)(两种存图方式) 题外话,这是我第40篇随笔,纪念一下.<( ̄︶ ̄)↗[GO!] 题意 是说有棵树,每个节点上 ...
- [BZOJ3626] [LNOI2014]LCA(树链剖分)
[BZOJ3626] [LNOI2014]LCA(树链剖分) 题面 给出一棵N个点的树,要求支持Q次询问,每次询问一个点z与编号为区间[l,r]内的点分别求最近公共祖先得到的最近公共祖先深度和.N, ...
- Codeforces Round #329 (Div. 2) D. Happy Tree Party LCA/树链剖分
D. Happy Tree Party Bogdan has a birthday today and mom gave him a tree consisting of n vertecie ...
- HDU 5044 Tree(树链剖分)
HDU 5044 Tree field=problem&key=2014+ACM%2FICPC+Asia+Regional+Shanghai+Online&source=1&s ...
- HDU 4718 The LCIS on the Tree(树链剖分)
Problem Description For a sequence S1, S2, ... , SN, and a pair of integers (i, j), if 1 <= i < ...
- 【POJ3237】Tree(树链剖分)
题意:在一棵N个节点,有边权的树上维护以下操作: 1:单边修改,将第X条边的边权修改成Y 2:区间取反,将点X与Y在树上路径中的所有边边权取反 3:区间询问最大值,询问X到Y树上路径中边权最大值 n& ...
随机推荐
- 用SQL语句添加删除修改字段_常用SQL
1.增加字段 alter table docdsp add dspcodechar(200)2.删除字段 ALTER TABLE table_NAME DROP COLUMNc ...
- web桌面程序之锁屏功能分析
这是一个在操作系统里比较常见的功能,但在web里实现,有哪些需要注意的呢? 1.如何真正的实现锁屏? 2.如何避免通过技术手段绕过锁屏? 我个人总结出2点需要特别注意的地方,下面就分别进行分析. 第一 ...
- liMarquee演示12种不同的无缝滚动效果
很实用的一款liMarquee演示12种不同的无缝滚动效果 在线预览 下载地址 实例代码 <!DOCTYPE html> <html lang="zh-CN"&g ...
- Select-or-Die:灵活的 jQuery 下拉列表插件
Select-or-Die 是一个 jQuery 插件,用来自定义下拉列表(Select)元素.原生的下拉选择元素在各个浏览器的默认样式差异很多,而且自定义样式很困难,因此 Web 开发人员喜欢使用插 ...
- 值得 Web 开发人员收藏的16款 HTML5 工具
HTML5 正在迅速改变创建和管理网站的方式.HTML5 在不同的领域让网页设计更强大的.快速,安全,响应式,互动和美丽,这些优点吸引更多的 Web 开发人员使用 HTML5 开发各种网站和应用程序. ...
- Ajax中get和post使用问题
使用get遇到的问题: 1.问题一. 缓存:当每次访问的url相同,客户端直接读取本地缓存里面的内容,即使后台数据变化前台也不会有变化: 解决方法:在?后面链接一个num=[随机数Math.rando ...
- css选择器中:first-child与:first-of-type的区别
:first-child选择器是css2中定义的选择器,从字面意思上来看也很好理解,就是第一个子元素.比如有段代码: p:first-child 匹配到的是p元素,因为p元素是div的第一个子元素: ...
- javascript --- 原型初探七日谈(三)
原型陷阱: 在处理原型问题上时,我们要注意两种行为. 1. 当我们对原型对象执行完全替换的时候,有可能会触发原型链的某种异常. 2. prototype.constructor 属性是不可靠的. 下面 ...
- 【转】ES6 手册
目录 var 和 let/const 的比较 用块级作用域代替 IIFES 箭头函数 字符串 解构 模块 参数 类 Classes Symbols Maps WeakMaps Promises Gen ...
- Arcgis创建SDE_Geometry、SDO_Geometry的区别【转】
1. SDO_GEOMETRY Oracle Spatial在MDSYS模式下定义了一系列几何类型.函数来支持空间数据的存储和使用,最为人耳熟能详的就是SDO_GEOMETRY这种类型——当然,Arc ...