树链剖分第一题QAQ,纪念下

#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;
const int maxn = 1e5 + 10;
#define to first
#define next second
#define foreach(it,v) for(__typeof(v.begin()) it = v.begin(); it != v.end(); ++it)
int pos[maxn],head[maxn],fa[maxn],son[maxn];
int a[maxn],siz[maxn],root[maxn],dep[maxn];
typedef pair<int,int> Edge;
Edge edges[maxn<<1];
int e,tot;
void AddEdge(int u,int v)
{
edges[++e] = make_pair(v,head[u]);head[u] = e;
edges[++e] = make_pair(u,head[v]);head[v] = e;
}
void pre(int u)
{
siz[u] = 1;son[u] = 0;
dep[u] = dep[fa[u]] + 1;
for(int i = head[u]; i ; i = edges[i].next) {
int v = edges[i].to;
if(v == fa[u])continue;
fa[v] = u;
pre(v);
siz[u] += siz[v];
if(siz[son[u]] < siz[v]) son[u] = v;
}
}
void built(int u,int t)
{
root[u] = t;
pos[u] = ++tot;
if(son[u] < 1) return;
built(son[u],t);
for(int i = head[u]; i ; i = edges[i].next) {
int v = edges[i].to;
if(v == fa[u] || v == son[u])continue;
built(v,v);
}
}
int seg[maxn<<2];
int ql,qr,x,v;
void Modify(int o,int L,int R)
{
if(L == R) {
seg[o] = v;
return ;
}
int mid = (L+R)>>1;
if(x<=mid) Modify(o<<1,L,mid);
else Modify(o<<1|1,mid+1,R);
seg[o] = seg[o<<1] ^ seg[o<<1|1];
}
int Queryseg(int o,int L,int R)
{
if(ql<=L&&qr>=R) return seg[o];
int mid = (L+R) >> 1;
int res = 0;
if(ql <= mid) res = Queryseg(o<<1,L,mid);
if(qr > mid) res ^= Queryseg(o<<1|1,mid+1,R);
return res;
}
int solve(int u,int v)
{
int res = 0;
while(root[u] != root[v]) {
if(dep[root[u]] < dep[root[v]]) swap(u,v);
ql = pos[root[u]],qr = pos[u];
res ^= Queryseg(1,1,tot);
u = fa[root[u]];
}
ql = pos[u],qr = pos[v];
if(ql > qr) swap(ql,qr);
res ^= Queryseg(1,1,tot);
return res;
}
int main(int argc, char const *argv[])
{
int T;scanf("%d",&T);
while(T--) {
int N,Q;scanf("%d%d",&N,&Q);
dep[0] = e = tot = 0;
memset(seg,0,sizeof seg);
memset(head,0,sizeof(head[0])*(N+1));
for(int i = 1; i < N; i++) {
int u,v;scanf("%d%d",&u,&v);
AddEdge(u,v);
}
fa[1] = siz[0] = 0;
pre(1);
built(1,1);
for(int i = 1; i <= N; i++) {
scanf("%d",&v); ++v; x = pos[i];
Modify(1,1,tot);
}
while(Q--) {
int op;scanf("%d",&op);
if(op==0) {
scanf("%d%d",&x,&v);x = pos[x]; ++v;
Modify(1,1,tot);
} else {
scanf("%d%d",&ql,&qr);
int ans = solve(ql,qr);
printf("%d\n", ans - 1);
}
}
}
return 0;
}

HDU 5274(树链剖分)的更多相关文章

  1. hdu 5274 树链剖分

    Dylans loves tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

  2. hdu 5893 (树链剖分+合并)

    List wants to travel Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/O ...

  3. hdu 5052 树链剖分

    Yaoge’s maximum profit Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/ ...

  4. hdu 4897 树链剖分(重轻链)

    Little Devil I Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others ...

  5. HDU 3966 (树链剖分+线段树)

    Problem Aragorn's Story (HDU 3966) 题目大意 给定一颗树,有点权. 要求支持两种操作,将一条路径上的所有点权值增加或减少ai,询问某点的权值. 解题分析 树链剖分模板 ...

  6. hdu 3966(树链剖分+线段树区间更新)

    传送门:Problem 3966 https://www.cnblogs.com/violet-acmer/p/9711441.html 学习资料: [1]线段树区间更新:https://blog.c ...

  7. HDU 3966 /// 树链剖分+树状数组

    题意: http://acm.hdu.edu.cn/showproblem.php?pid=3966 给一棵树,并给定各个点权的值,然后有3种操作: I x y z : 把x到y的路径上的所有点权值加 ...

  8. hdu 4729 树链剖分

    思路:这个树链剖分其实还是比较明显的.将边按权值排序后插入线段树,然后用线段树查找区间中比某个数小的数和,以及这样的数的个数.当A<=B时,就全部建新的管子. 对于A>B的情况比较 建一条 ...

  9. hdu 3966 树链剖分

    思路:树链剖分入门题,我这门入得好苦啊,程序很快写出来了,可是在LCA过程中把update函数里的左右边界位置写反了,一直RE到死. #pragma comment(linker, "/ST ...

随机推荐

  1. 记录一下自己总结出来的,在内网环境下使用maven打包的各种方法,包括各种常用的打包方式(一)

    (一)内外网代理仓库搭建 想了一下,先用这个MAVEN安装部署的说明随笔,作为自己的第一篇技术帖,往后会陆陆续续将自己研究的心得发出来,留下脚印.希望有大神可以指点 一 .文章主要解决问题说明 1) ...

  2. C# WPF 建立渐隐窗口

    需求: 一些无关紧要的提示信息,不显示出来怕用户一头雾水,但如果用对话框显示出来,用户又要动手把对话框关闭.不说别人,就是程序员自己测试时都觉得麻烦! 解决方案: 有两种选择 1. 选择是用 labe ...

  3. 怎么样学好C++

    声明:这篇文章非本人所写,转自:http://coolshell.cn/articles/4119.html 昨天写了一篇如何学好C语言,就有人回复问我如何学好C++,所以,我把我个人的一些学习经验写 ...

  4. Tree( 树) 组件[1]

    本节课重点了解 EasyUI 中 Tree(树)组件的使用方法, 这个组件依赖于 Draggable(拖动)和 Droppable(放置)组件. 一. 加载方式//class 加载方式<ul c ...

  5. 网页、JavaScript 数据类型

    JavaScript 数据类型 一.基本数据类型: 字符串.数字.布尔.日期和时间 JavaScript 拥有动态类型 JavaScript 拥有动态类型.这意味着相同的变量可用作不同的类型: 1 v ...

  6. 在MVC中如何愉快使用Ajax

    前言: 这个故事要从我老大与客户谈需求开始说起.前几天,遇见一个逗比客户,不知道是听了哪个逗比程序员的临终遗言...让我们给他做一个手机端的Web应用出来,还说要使用MVC来做(不是App).马币,客 ...

  7. android 开发工具(转)

    一.Android SDK (Android SDK主安装包,包含SDK Manager.AVD Manager.工具包tools,释放后的根文件夹为android-sdk-windows): rev ...

  8. C# 解析嵌套的json文件.

    概述 今天我同学问我如何转换json文件,没处理过,网上搜了一下,json转excel的很少,反过来倒是有许多人写了工具. json文件的结构大致是这样的: {, , }, , "type& ...

  9. 在Silverlight中打开网页的几种方法

    HtmlPage.PopupWindow HtmlPopupWindowOptions option = new HtmlPopupWindowOptions(); option.Directorie ...

  10. Linux下MySQL的彻底卸载和安装配置字符集

    前言: Linux环境下MySQL的安装和配置在网上已经有很多教程了.之所以写这篇文章是因为在配置字符集的时候找了网上的一些教程发现并不能用导致折腾了一阵子.下面的教程均是亲自实践. MySQL的彻底 ...