树链剖分第一题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. Linux下一些基本操作

    一.忘记root密码 1. sudo passwd root 2. 输入新密码. 二.查看内核版本: 1.查看内核版本命令:1) cat /proc/version 2) uname -a 3)  u ...

  2. Tabs( 选项卡)

    一. 加载方式 //class 加载方式<div id="box" class="easyui-tabs" style="width:500px ...

  3. C# Interface显式实现和隐式实现

    c#中对接口的实现方式有两种:隐式实现和显式实现,之前一直没仔细看过,今天查了些资料,在这里整理一下. 隐式实现的例子 interface IChinese { string Speak(); } p ...

  4. FreeMarker辅助

    /** * FreeMarker 辅助类 * @author Rubekid * */ public class FreeMarkerHelper { /** * 模板文件存放目录 */ privat ...

  5. MVC第一节 配置

    1.View中的页面设置为起始页后导致404找不到文件. 解决方案:右键属性,把特定页置为空. 2.新建的MVC项目会把系统默认的浏览器作为浏览方式,如果想要改变的话.可以在项目中新建一个webFor ...

  6. Oracle数据库中的blob类型解析

    Oracle的Blob字段比较特殊,他比long字段的性能要好很多,可以用来保存例如图片之类的二进制数据. 写入Blob字段和写入其它类型字段的方式非常不同,因为Blob自身有一个cursor,你必须 ...

  7. SignalR小计

    微软官方例子地址:http://www.asp.net/signalr/overview/getting-started/tutorial-getting-started-with-signalr-a ...

  8. spring 学习 AOP和IOC

    自11开始接触三大框架,至今已俞5载, 当时风光无限的ssh,现在还在被广泛使用,并有扩大之势的只有spring了 spring主要特性,是广为使用的AOP(面向切面)和IOC(控制反转) 1.其中, ...

  9. Win7下VS2010使用STLPort 和boost1.56.

    STLport的下载地址 http://sourceforge.net/projects/stlport/ 下载后,解压出文件.我的目录是 D:\STLport-5.2.1 . 右键计算机,属性,高级 ...

  10. mysql 主从搭建

    主要搭建步骤如下: 1.打开binlog,设置server_id     打开主库的--log-bin,并设置server_id 2.主库授权                --最好也在从库对主库授权 ...