【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid=5274

【题目大意】

  给出一棵树,每个点有一个权值,权值可修改,且大于等于0,询问链上出现次数为奇数的数,题目保证每次询问的链上最多只有一个数出现次数为奇数。如果不存在这样的数,就输出-1。

【题解】

  题目等价于求链上点的异或和,树链剖分,线段树维护区间异或和,然后链上查询即可,注意到存在权值为0的特殊情况,所以我们将更新的数字都+1,在最后处理答案的时候-1即可。

【代码】

#include <cstdio>
#include <algorithm>
#include <climits>
#include <cstring>
using namespace std;
const int N=300010;
int val[N],tot,op,x,d[N],num[N],ed=0,u,w,n,m,i,v[N],vis[N],f[N],g[N],nxt[N],size[N],son[N],st[N],en[N],dfn,top[N],t;char ch;
void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
void dfs(int x){size[x]=1;for(int i=g[x];i;i=nxt[i])if(v[i]!=f[x]){f[v[i]]=x,d[v[i]]=d[x]+1;dfs(v[i]),size[x]+=size[v[i]];if(size[v[i]]>size[son[x]])son[x]=v[i];}
}
void dfs2(int x,int y){if(x==-1)return;st[x]=++dfn;top[x]=y;if(son[x])dfs2(son[x],y);for(int i=g[x];i;i=nxt[i])if(v[i]!=son[x]&&v[i]!=f[x])dfs2(v[i],v[i]);en[x]=dfn;
}
struct Node{int l,r;int sum;}T[N*4];
void build(int x,int l,int r){T[x].l=l;T[x].r=r;T[x].sum=0;if(l==r)return;int mid=(l+r)>>1;build(x<<1,l,mid);build((x<<1)|1,mid+1,r);
}
void up(int x){T[x].sum=T[x<<1].sum^T[x<<1|1].sum;}
void update(int x,int k,int val){if(T[x].l==k&&T[x].r==k){T[x].sum^=val;return;}int mid=(T[x].l+T[x].r)>>1;if(k<=mid)update(x<<1,k,val);else update((x<<1)|1,k,val); up(x);
}
int sum(int x,int l,int r){if(l<=T[x].l&&T[x].r<=r)return T[x].sum;int mid=(T[x].l+T[x].r)>>1,tmp=0;if(l<=mid)tmp^=sum(x<<1,l,r);if(r>mid)tmp^=sum((x<<1)|1,l,r);return tmp;
}
int chain(int x,int y){int res=0;for(;top[x]!=top[y];x=f[top[x]]){if(d[top[x]]<d[top[y]]){int z=x;x=y;y=z;}res^=sum(1,st[top[x]],st[x]);}if(d[x]<d[y]){int z=x;x=y;y=z;}res^=sum(1,st[y],st[x]);return res;
}
void init(){ memset(g,dfn=ed=tot=0,sizeof(g));memset(v,0,sizeof(v));memset(nxt,0,sizeof(nxt));memset(son,-1,sizeof(son));
}
int cas;
int main(){scanf("%d",&cas);while(cas--){init();scanf("%d%d",&n,&m);for(int i=1;i<n;i++){scanf("%d%d",&u,&w);add(u,w); add(w,u); }dfs(1);dfs2(1,1);build(1,1,dfn);for(int i=1;i<=n;i++){scanf("%d",&val[i]); val[i]++;update(1,st[i],val[i]);}while(m--){scanf("%d%d%d",&op,&u,&w);if(op){printf("%d\n",chain(u,w)-1);}else{update(1,st[u],val[u]^(w+1));val[u]=w+1;}}}return 0;
}

  

转载于:https://www.cnblogs.com/forever97/p/hdu5274.html

HDU 5274 Dylans loves tree(树链剖分)相关推荐

  1. HDU - 3804 Query on a tree(树链剖分+线段树+离线处理)

    题目链接:点击查看 题目大意:给出一棵树,每条边上都有一个权值,给出m个查询:a,b:问从点1到点a的唯一路径上,在边权小于等于b的边中选出边权最大的值输出,若没有符合条件的边则输出-1: 题目分析: ...

  2. HDU 5044 Tree 树链剖分

    树链剖分离线处理所有的增加操作.考虑如果在线性结构上面处理这样的问题,只要把增加区域的起始点+w,结束点的后面一个点-w,最终输出答案的时候只要扫描一遍就好了,现在通过树链剖分把树转化为类似的线性结构 ...

  3. POJ 3237.Tree -树链剖分(边权)(边值更新、路径边权最值、区间标记)贴个板子备忘...

    Tree Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 12247   Accepted: 3151 Descriptio ...

  4. CodeForces - 343D Water Tree(树链剖分+线段树)

    题目链接: 题目大意:给出一棵由n个点组成的树,初始时每个点的权值为0,接下来有m个操作,每个操作分为以下三种: 1 x:将包括节点x在内的所有子孙节点的权值都改为1 2 x:将包括节点x在内的所有父 ...

  5. SPOJ - QTREE Query on a tree(树链剖分+线段树)

    题目链接:点击查看 题目大意:给出一棵由n个点组成的树,再给出数个操作,每次操作分为下列几种类型: QUERY x y:询问点x-点y这条路径上的所有边权的最大值 CHANGE x y:将第x条边的权 ...

  6. 计蒜客 - Distance on the tree(树链剖分+离线处理+线段树)

    题目链接:点击查看 题目大意:给出一颗含有n个节点的树,每条边都有权值,现在给出m个询问,每次询问的格式为u,v,w,我们需要求出在路径u-v上,边权小于等于w的边的个数 题目分析:因为一开始不会主席 ...

  7. hdu 4897 Little Devil I (树链剖分+线段树)

    题目链接:  http://acm.hdu.edu.cn/showproblem.php?pid=4897 题意: 给你一棵树,一开始每条边都是白色,有三种操作: 1.将 u - v路径上的边转换颜色 ...

  8. SPOJ 375 query on a tree 树链剖分

    题意: 给一棵树型数据结构 ①支持修改边的权值      ②支持成段边权最值查询 树链剖分入门题. 树链剖分+线段树 用的notonlysuccess的线段树--不开结构体事先预处理的那种 我以前写的 ...

  9. POJ 3237 Tree (树链剖分 路径剖分 线段树的lazy标记)

    题目链接:http://poj.org/problem?id=3237 一棵有边权的树,有3种操作. 树链剖分+线段树lazy标记.lazy为0表示没更新区间或者区间更新了2的倍数次,1表示为更新,每 ...

最新文章

  1. MySQL 笔记9 -- PyMySQL
  2. jquery滚动条到底部触发事件
  3. git reset --hanrd撤回_一篇文章,全面掌握Git
  4. JDK动态代理运行期生成的字节码文件class,获取反编译方法
  5. hive如何获取当前时间
  6. 构建之法读书笔记02
  7. Flutter之实战InheritedWidget详解
  8. layui表格边框_layui怎么固定表格的表头
  9. Oracle 11g 服务名称以及作用
  10. python socket实现浏览器访问本地文件资源即静态网页(TCP)
  11. Revel框架基本使用和搭建教程
  12. 嵌入式Linux小项目之图片编解码播放器(5)
  13. 以下不是python语言合法变量_违法行为的客体是指法律所保护的而为违法行为所侵害的:()...
  14. linux信号量对mysql_MySQL 信号量semaphore 和 innodb_adaptive_hash_index
  15. Artemis资源限制(17)
  16. 模板模式template
  17. Lua(二)数据类型+变量
  18. HTML零基础入门学习大全-干货!
  19. Access2007实用教程pdf
  20. c++ 高精度 加减乘除 四则运算 代码实现

热门文章

  1. node.js发送邮件
  2. Mybatis报错 TooManyResultsException
  3. 软件工程--软件计划
  4. 离职那天!同龄的CTO悄悄私信我,他的年薪是我的10倍
  5. 假笨说-我是如何走上JVM这条贼船的
  6. Underscore.js 入门
  7. 刚刚,国家新型互联网交换中心(以及新公司)正式成立!不止于降低网间结算费用...
  8. 学校机房项目交换机的配置:
  9. 无头虚拟化服务器,VBoxHeadless - 使用VirtualBox 4.0在无头Ubuntu 10.10服务器上运行虚拟机...
  10. android获取小程序音频时长,最新微信小程序获取音频时长与实时获取播放进度...