Dylans loves tree

http://acm.hdu.edu.cn/showproblem.php?pid=5274

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)

Problem Description
Dylans is given a tree with N nodes.

All nodes have a value A[i] .Nodes on tree is numbered by 1∼N .

Then he is given Q questions like that:

①0 x y :change node x′s value to y

②1 x y :For all the value in the path from x to y ,do they all appear even times?

For each ② question,it guarantees that
there is at most one value that appears odd times on the path.

1≤N,Q≤100000 , the value A[i]∈N and A[i]≤100000

 
 
Input
In the first line there is a test number T .
(T≤3 and there is at most one testcase that N>1000 )

For each testcase:

In the first line there are two numbers N and Q .

Then in the next N−1 lines there are pairs of (X,Y) that stand for a road from x to y .

Then in the next line there are N numbers A1..AN stand for value.

In the next Q lines there are three numbers(opt,x,y) .

 
Output
For each question ② in each testcase,if the value all
appear even times output "-1",otherwise output the value that appears odd
times.
 
Sample Input
1
3 2
1 2
2 3
1 1 1
1 1 2
1 1 3
 
Sample Output
-1 1
 
题目大意:给出一颗n个点的树,有q个操作,点有点权。
操作① 0,x,y 修改x的点权为y
操作② 1,x,y 询问点x到点y是否有出现过奇数次的权值,有则输出,无则输出-1。输入保证至多有一个出现过一次的权值
基本框架:树链剖分+线段树
思路:单点修改+询问区间异或和
若k出现过偶数次,则这些k的异或和为0
若只有1个k出现过奇数次,那异或的结果=k
一个小细节:
因为0无论异或多少次都是0,所以将所有数都+1,输出答案-1
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 100001
using namespace std;
struct node
{
int l,r,key;
void clear() {l=r=key=;}
}tr[N*];
struct edge{int next,to;}e[N*];
int id[N],dep[N],son[N],fa[N],bl[N],sz,e_tot,tr_tot,T,n,q,head[N];
inline void add(int u,int v)
{
e[++e_tot].to=v;e[e_tot].next=head[u];head[u]=e_tot;
e[++e_tot].to=u;e[e_tot].next=head[v];head[v]=e_tot;
}
inline void dfs1(int x,int f)
{
son[x]++;
for(int i=head[x];i;i=e[i].next)
{
if(e[i].to==fa[x]) continue;
dep[e[i].to]=dep[x]+;
fa[e[i].to]=x;
dfs1(e[i].to,x);
son[x]+=son[e[i].to];
}
}
inline void dfs2(int x,int chain)
{
sz++;
bl[x]=chain;
id[x]=sz;
int y=;
for(int i=head[x];i;i=e[i].next)
{
if(e[i].to==fa[x]) continue;
if(son[e[i].to]>son[y]) y=e[i].to;
}
if(!y) return;
dfs2(y,chain);
for(int i=head[x];i;i=e[i].next)
{
if(e[i].to==fa[x]||e[i].to==y) continue;
dfs2(e[i].to,e[i].to);
}
}
inline void build(int l,int r)
{
tr_tot++; tr[tr_tot].clear();
tr[tr_tot].l=l;tr[tr_tot].r=r;
if(l==r) return;
int mid=l+r>>;
build(l,mid);build(mid+,r);
}
inline void change(int k,int x,int w)
{
if(tr[k].l==tr[k].r) {tr[k].key=w;return;}
int mid=tr[k].l+tr[k].r>>,l=k+,r=k+(tr[k+].r-tr[k+].l+<<);
if(x<=mid) change(l,x,w);
else change(r,x,w);
tr[k].key=tr[l].key^tr[r].key;
}
inline int query(int k,int opl,int opr)
{
if(tr[k].l>=opl&&tr[k].r<=opr) {return tr[k].key;}
int mid=tr[k].l+tr[k].r>>,l=k+,r=k+(tr[k+].r-tr[k+].l+<<);
int tmp=;
if(opl<=mid) tmp=query(l,opl,opr);
if(opr>mid) tmp^=query(r,opl,opr);
return tmp;
}
inline void solve_query(int u,int v)
{
int ans=;
while(bl[u]!=bl[v])
{
if(dep[bl[u]]<dep[bl[v]]) swap(u,v);
ans^=query(,id[bl[u]],id[u]);
u=fa[bl[u]];
}
if(id[u]>id[v]) swap(u,v);
ans^=query(,id[u],id[v]);
printf("%d\n",ans-);
}
inline void solve()
{
int p,x,y;
for(int i=;i<=n;i++)
{
scanf("%d",&x);
change(,id[i],x+);
}
for(int i=;i<=q;i++)
{
scanf("%d%d%d",&p,&x,&y);
if(!p) change(,id[x],y+);
else solve_query(x,y);
}
}
inline void pre()
{
memset(son,,sizeof(son));
memset(head,,sizeof(head));
memset(fa,,sizeof(fa));
memset(dep,,sizeof(dep));
sz=e_tot=tr_tot=;
}
int main()
{
scanf("%d",&T);
while(T--)
{
pre();
scanf("%d%d",&n,&q);
int u,v;
for(int i=;i<n;i++)
{
scanf("%d%d",&u,&v);
add(u,v);
}
dfs1(,);
dfs2(,);
build(,n);
solve();
}
}

hdu 5274 Dylans loves tree的更多相关文章

  1. hdu 5274 Dylans loves tree(LCA + 线段树)

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

  2. Hdu 5274 Dylans loves tree (树链剖分模板)

    Hdu 5274 Dylans loves tree (树链剖分模板) 题目传送门 #include <queue> #include <cmath> #include < ...

  3. hdu 5274 Dylans loves tree (树链剖分 + 线段树 异或)

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

  4. HDU 5274 Dylans loves tree 树链剖分+线段树

    Dylans loves tree Problem Description Dylans is given a tree with N nodes. All nodes have a value A[ ...

  5. HDU 5274 Dylans loves tree(树链剖分)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5274 [题目大意] 给出一棵树,每个点有一个权值,权值可修改,且大于等于0,询问链上出现次数为奇数 ...

  6. HDU 5274 Dylans loves tree(LCA+dfs时间戳+成段更新 OR 树链剖分+单点更新)

    Problem Description Dylans is given a tree with N nodes. All nodes have a value A[i].Nodes on tree i ...

  7. AC日记——Dylans loves tree hdu 5274

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

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

    Dylans loves tree view code#pragma comment(linker, "/STACK:1024000000,1024000000") #includ ...

  9. hdu 5273 Dylans loves sequence

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5273 Dylans loves sequence Description Dylans is give ...

随机推荐

  1. Mybatis常见面试题

    Mybatis常见面试题 #{}和${}的区别是什么? #{}和${}的区别是什么? 在Mybatis中,有两种占位符 #{}解析传递进来的参数数据 ${}对传递进来的参数原样拼接在SQL中 #{}是 ...

  2. [NOI2006]神奇口袋

    题面在这里 题意 开始时袋中有\(t\)种小球,第\(i\)种小球有\(t_i\)个,之后每次等概率取出一个球,第\(i\)次取球时观察这个球的颜色\(c_i\)放回并向袋中加入\(d\)个颜色为\( ...

  3. linux jdk 和tomcat环境变量配置

    系统版本:centos6.5版本 java版本:1.8 一.准备工作 1. java -version 检查是否有java环境,没有则需要去安装并配置到环境变量中. 2.下载tomcat包,下载地址: ...

  4. Django入门-通用视图

    文档:https://docs.djangoproject.com/en/1.11/topics/class-based-views/ from django.shortcuts import get ...

  5. c#事件的应用

    我已经多次使用c#事件了.举个最近的例子:我用vsto做的一个word插件.这个插件分为两层,业务逻辑层和word外接程序.有这么一个场景,我的ribbon中的一个label是动态显示的.它会随着wo ...

  6. java的枚举2

    首先先理解一下java中枚举的本质. java的世界中一切皆是类,下面通过一个例子解释一下enum的本质: package cn.xnchall.enumeration; public class G ...

  7. Ubuntu14.04 设置wifi热点

    Ubuntu14.04 设置wifi热点 $ sudo add-apt-repository ppa:nilarimogard/webupd8 $ sudo apt-get update $ sudo ...

  8. 如何为开发项目编写规范的README文件(windows),此文详解

    为什么要写这篇博客? 其实我是一个入坑已经半年的程序员,因为不是计算机专业,只能自己摸索,所以我深知博客的重要性.每次我的学习笔记啊,项目的,面试题啊,有的,只要有时间,我肯定上传上来,一方面自己可以 ...

  9. linux修改时区

    Linux修改时区 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任 CentOS6: 查看以前的时区: [root@localhost mysq ...

  10. JS常用函数用途小记

    concat() 方法用于连接两个或多个数组. 该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本. var a = [1,2,3]; document.write(a.concat(4,5) ...