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& ...
随机推荐
- Java识别操作系统
/** * Created by xfyou on 2016/11/3. */ public class SysDep { final static String UNIX_NULL_DEV = &q ...
- 如何解决CRUD操作中与业务无关的字段赋值
提高效率一直是个永恒的话题,编程中有一项也是可以提到效率的,那就是专注做一件事情,让其它没有强紧密联系的与之分开.这里分享下我们做CRUD时遇到的常见数据处理场景: 数据库表字段全部设计为非空,即使这 ...
- 25条来自 Google 的移动网站设计准则
越来越的用于通过移动设备访问网络,因此对于企业来说,现在比以往任何时候都更需要一个移动网站.但是,怎么样才能制作一个优秀的移动网站呢? 为了回答这个问题,Google 与 AnswerLab 合作,研 ...
- CSS中的margin、border、padding区别
CSS padding margin border属性详解 图解CSS padding.margin.border属性W3C组织建议把所有网页上的对像都放在一个盒(box)中,设计师可以通过创建定义来 ...
- sql搜索数据库中具有某列的表
在接口中明明有某个节点,但在数据库中却找不到,为此本人写了一个sql,以供快速查找. Select distinct syscolumns.name,sysobjects.name from sysc ...
- Asp.net EasyUI中的combogrid实现分页功能
在jquery.easyUI.js 要实现分页,必须在后台接收参数时声明两个变量:page(当前第几页),rows(每页显示多少条信息),否者easyUI前台传递不了分页参数. 这两个属性的名称在ea ...
- Java Web 三层架构详解
java 三层架构ssh 一个spring2.5+hibernate3.2+struts2.0组合框架,使用spring的 IoC来管理应用的 所有bean,包括struts2的 action,充分发 ...
- 27款后台管理页面设计 DIV+CSS+JS
-----------. 演示: http://www.websjy.com/club/websj ... _61040268/index.htm http://www.websjy.com/club ...
- Android闹钟 AlarmManager的使用
Android闹钟 AlarmManager的使用 AlarmManager介绍 AlarmManager这个类提供对系统闹钟服务的访问接口. 你可以为你的应用设定一个在未来某个时间唤醒的功能. 当闹 ...
- ReactiveCocoa基础知识内容2
引用网络上一些实例的代码,针对ReactiveCocoa的运用可以更加有帮助: 1:跟AF结合时的写法,返回RACSignal - (RACSignal *)fetchQuestionWithTag: ...