Dylans loves tree

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

Total Submission(s): 747    Accepted Submission(s): 144

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
Hint
If you want to hack someone,N and Q in your testdata must smaller than 10000,and you shouldn't print any space in each end of the line.
 
Source
 
Recommend
hujie   |   We have carefully selected several similar problems for you:  5275 5272 5271 5270 5268 

先考虑无改动的情况,令Xor[i]表示i到根节点路径上的异或和。则随意节点的(u,v)的异或和能够转化为Xor[u]^Xor[v]^a[LCA(u,v)].考虑改动的情况。改动节点u,仅仅会以u为根的子树的Xor值产生影响,由于一颗子树的dfs序是连续的我们非常自然的想到用线段树去维护他,pSeg[u]表示u在dfs序中的位置,siz[u]表示以u为根的子树大小,则这课颗子树相应的区间就是[pSeg[u],pSeg[u]+siz[u]-1],改动的时候仅仅须要将这段区间先异或上原来的值a[u],在异或上要变成的值y,然后改动a[u]
= y;两次异或能够一步到位。直接异或上a[u]^y即可。

#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],d[20][maxn<<1],wid[maxn<<1],head[maxn];
int a[maxn],depth[maxn],sid,pSeg[maxn],siz[maxn],Xor[maxn];
typedef pair<int,int> Edge;
Edge edges[maxn<<1];
int tot = 0,e = 0;
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,int fa,int dep = 0,int Xo = 0)
{
Xo ^= a[u];
Xor[++sid] = Xo;
pSeg[u] = sid;
siz[u] = 1;
d[0][++tot] = u;
if(!pos[u]) {
pos[u] = tot;
depth[u] = dep;
}
for(int i = head[u]; i ; i = edges[i].next) {
int v = edges[i].to;
if(v == fa) continue;
pre(v,u,dep+1,Xo);
siz[u] += siz[v];
d[0][++tot] = u;
}
}
void RMQ_init(int n)
{
for(int i = 1,w = 1; i <= n; i++) {
if((1<<w)<=i) w++;
wid[i] = w - 1;
}
for(int i = 1; (1<<i) <= n; i++) {
for(int j = 1; j + (1<<i) - 1 <= n; j++) {
d[i][j] = depth[d[i-1][j]] < depth[d[i-1][j+(1<<(i-1))]] ? d[i-1][j] : d[i-1][j+(1<<(i-1))];
}
}
}
int LCA(int u,int v)
{
u = pos[u];
v = pos[v];
if(u > v) swap(u,v);
int k = wid[v-u+1];
return depth[d[k][u]] < depth[d[k][v-(1<<k)+1]] ? d[k][u] : d[k][v-(1<<k)+1];
}
int seg[maxn<<2];
int ql,qr,x;
void push_down(int o)
{
seg[o<<1] ^= seg[o];
seg[o<<1|1] ^= seg[o];
seg[o] = 0;
}
void Modify(int o,int L,int R)
{
if(ql<=L&&qr>=R) {
seg[o] ^= x;
return ;
}
push_down(o);
int mid = (L+R)>>1;
if(ql<=mid) Modify(o<<1,L,mid);
if(qr>mid) Modify(o<<1|1,mid+1,R);
}
int Query(int o,int L,int R)
{
if(L == R) {
return Xor[L] ^ seg[o];
}
int mid = (L+R) >>1;
push_down(o);
if(x<=mid)return Query(o<<1,L,mid);
return Query(o<<1|1,mid+1,R);
}
int main(int argc, char const *argv[])
{
int T;scanf("%d",&T);
while(T--) {
int N,Q;scanf("%d%d",&N,&Q);
e = sid = tot = 0;
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);
}
for(int i = 1; i <= N; i++) {
scanf("%d",a+i);
++a[i];
}
pre(1,-1);
RMQ_init(tot);
memset(seg,0,sizeof(seg[0])*(2*N+10));
while(Q--) {
scanf("%d%d%d",&x,&ql,&qr);
if(x==0) {
qr++;
int L = pSeg[ql], R = pSeg[ql] + siz[ql] - 1;
x = a[ql] ^ qr;
a[ql] = qr;
ql = L,qr = R;
Modify(1,1,N);
}else {
x = pSeg[ql];
int ans = Query(1,1,N);
x = pSeg[qr];
ans ^= Query(1,1,N);
ans ^= a[LCA(ql,qr)];
if(ans==0)puts("-1");
else printf("%d\n", ans-1);
}
}
}
return 0;
}

HDU 5274(LCA + 线段树)的更多相关文章

  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 5266 pog loves szh III(lca + 线段树)

    I - pog loves szh III Time Limit:6000MS     Memory Limit:131072KB     64bit IO Format:%I64d & %I ...

  3. hdu 4031 attack 线段树区间更新

    Attack Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others)Total Subm ...

  4. hdu 4288 离线线段树+间隔求和

    Coder Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  5. hdu 3016 dp+线段树

    Man Down Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  6. BZOJ 2243: [SDOI2011]染色 树链剖分 倍增lca 线段树

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  7. [51nod 1766]树上的最远点对 (树的直径+ST表求lca+线段树)

    [51nod 1766]树上的最远点对 (树的直径+ST表求lca+线段树) 题面 给出一棵N个点的树,Q次询问一点编号在区间[l1,r1]内,另一点编号在区间[l2,r2]内的所有点对距离最大值.\ ...

  8. 2018多校第十场 HDU 6430 (线段树合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6430 题意:一棵树上每个节点权值为v[i],每个节点的heard值是:以它为LCA的两个节点的GCD的 ...

  9. HDU 5877 dfs+ 线段树(或+树状树组)

    1.HDU 5877  Weak Pair 2.总结:有多种做法,这里写了dfs+线段树(或+树状树组),还可用主席树或平衡树,但还不会这两个 3.思路:利用dfs遍历子节点,同时对于每个子节点au, ...

随机推荐

  1. Maven系列--web.xml 配置详解

    一 .web.xml介绍 启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 紧接着,容 ...

  2. url中jsessionid的理解

    (1) 这是一个保险措施 因为Session默认是需要Cookie支持的 但有些客户浏览器是关闭Cookie的 这个时候就需要在URL中指定服务器上的session标识,也就是5F4771183629 ...

  3. 浅谈密码加SALT原理

    我们知道,如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然后通过查散列值字典(例如MD5密码破解网站),得到某用户的密码.  加Salt可以一定程度上解决这一问题.所谓加Salt方法, ...

  4. 洛谷—— P1260 工程规划

    https://www.luogu.org/problem/show?pid=1260 题目描述 造一幢大楼是一项艰巨的工程,它是由n个子任务构成的,给它们分别编号1,2,…,n(5≤n≤1000). ...

  5. 基于ORA-12170 TNS 连接超时解决办法详解

    转自原文 基于ORA-12170 TNS 连接超时解决办法详解 1.开始----程序-----Oracle------配置和移植工具-----Net Manager----本地----服务命名---o ...

  6. 使用Modernizr检测支持CSS3

    使用Modernizr检测支持CSS3 如果支持某个属性,会增加一个class,名字就是该属性: 不支持,名字是no-某属性 还提供了一个全局Modernizr对象,使用如下: <script ...

  7. 对Java、C#转学swift的提醒:学习swift首先要突破心理障碍。

    网上非常多都说swift是一门新手友好的语言. 但以我当年从Java转学Ruby的经验,swift对于从Java.C#转来的程序猿实际并不友好.原因就在于原来总有一种错觉:一个语言最重要的就是严谨,而 ...

  8. EF的CRUD

    已经知道EF就是一个能够使得编程人员用面向对象的思想操作数据库的框架,那么在最初学习SQL的时候我们就知道对数据库的操作就是增删改查.万变不离其宗. EF也是操作数据库的当然也就是要对数据库实现增删改 ...

  9. AJAX入门---点滴的积累

    AJAX入门---点滴的积累 每次学习完一个内容总会写上几句话总结一下学习的内容.这不刚看完王兴魁老师讲的AJAX核心技术.如今回想梳理一下. 这套视频的内容不多,简单的解说了XMLHttpReque ...

  10. ORA-1157错误解决

    一.错误描述 ORA-1157, "cannot identify/lock data file %s - see DBWR trace file" 引起的原因: 因为数据文件已经 ...