题意:给一棵树,每个点有权值。q次询问a,b,k,问你从a点到b点,每次跳距离k,权值的异或和?

预处理每个点往其根节点的路径上隔1~sqrt(n)的距离的异或和,然后把询问拆成a->lca(a,b),lca(a,b)->b,讨论一下即可,细节比较多。

队友的代码:

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int q,a[50004],fa[50004][18],s[50004][230],nxt[100005],to[100005],head[100005],en,sq,n,vis[50004],deep[50004];
void add(int u,int v)
{
nxt[++en]=head[u];
head[u]=en;
to[en]=v;
}
int get(int now,int x)
{
for(int i=17;i>=0;--i)
if(x>=(1<<i))
{
now=fa[now][i];
x-=(1<<i);
}
return now;
}
void dfs(int now)
{
vis[now]=1;
for(int i=1;i<=17;++i)
{
fa[now][i]=fa[fa[now][i-1]][i-1];
}
for(int i=1;i<=sq;++i)
{
s[now][i]=s[get(now,i)][i]^a[now];
}
for(int i=head[now];i;i=nxt[i])
if(!vis[to[i]])
{
fa[to[i]][0]=now;
deep[to[i]]=deep[now]+1;
dfs(to[i]);
}
}
int lca(int u,int v)
{
for(int i=17;i>=0;--i)
if(deep[fa[u][i]]>=deep[v])
u=fa[u][i];
for(int i=17;i>=0;--i)
if(deep[fa[v][i]]>=deep[u])
v=fa[v][i];
if(u==v)return u;
for(int i=17;i>=0;--i)
if(fa[u][i]!=fa[v][i])
{
u=fa[u][i];
v=fa[v][i];
}
return fa[u][0];
}
int main()
{
while(scanf("%d%d",&n,&q)!=EOF)
{
int u,v,k;
for(int i=1;i<n;++i)
{
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
sq=sqrt(n);
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
deep[1]=1;
dfs(1);
for(int i=1;i<=q;++i)
{
scanf("%d%d%d",&u,&v,&k);
if(k<=sq)
{
int nowans=0;
int l=lca(u,v);
int l1=(deep[u]-deep[l])%k;
int ll=get(l,k-l1);
nowans^=s[u][k];
nowans^=s[ll][k];
int l2=(deep[v]-deep[l]);
if(l2>=k-l1&&v!=l)
{
l2-=(k-l1);
v=get(v,l2%k);
l1=(deep[v]-deep[l])%k;
if(l1==0) ll=l;
else ll=get(l,k-l1);
nowans^=s[v][k];
nowans^=s[ll][k];
}
printf("%d\n",nowans);
}
else
{ int nowans=0;
int l=lca(u,v);
int l1=(deep[u]-deep[l])%k;
int ll=get(l,k-l1);
int now=u;
while(deep[now]>=deep[l])
{
nowans^=a[now];
now=get(now,k);
}
int l2=(deep[v]-deep[l]);
if(l2>=k-l1&&v!=l)
{
l2-=(k-l1);
v=get(v,l2%k);
now=v;
while(deep[now]>deep[l])
{
nowans^=a[now];
now=get(now,k);
}
}
printf("%d\n",nowans);
}
}
en=0;
for(int i=1;i<=n;++i)
{
head[i]=0;
for(int j=1;j<=sq;++j)
s[i][j]=0;
a[i]=0;
vis[i]=0;
deep[i]=0;
for(int j=0;j<=17;++j)
fa[i][j]=0;
}
}
return 0;
}

【分块】计蒜客17120 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 G. Xor的更多相关文章

  1. HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛)

    HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛) Panda Time Limit: 10000/4000 MS (Java/Others)    Memory Limit: ...

  2. 2016 ACM/ICPC亚洲区青岛站现场赛(部分题解)

    摘要 本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛. HDU 5 ...

  3. 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 M. Frequent Subsets Problem【状态压缩】

    2017 ACM-ICPC 亚洲区(南宁赛区)网络赛  M. Frequent Subsets Problem 题意:给定N和α还有M个U={1,2,3,...N}的子集,求子集X个数,X满足:X是U ...

  4. ICPC 2018 徐州赛区网络赛

    ACM-ICPC 2018 徐州赛区网络赛  去年博客记录过这场比赛经历:该死的水题  一年过去了,不被水题卡了,但难题也没多做几道.水平微微有点长进.     D. Easy Math 题意:   ...

  5. 【计算几何】【圆反演】计蒜客17314 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 G. Finding the Radius for an Inserted Circle

    题意:给你三个半径相同的圆,它们切在一起,然后让你往缝里一个一个地塞圆,问你塞到第k个的半径是多少. 就把上面那两个圆的切点当成反演中心,然后会反演成这个样子,两个平行直线和一个圆. 然后就是往那个圆 ...

  6. 【Trie】【kd-tree】计蒜客17122 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 I. Barty's Computer

    题意:2种操作:①往集合里添加一个串 ②给你四个小串a b c d,问你集合里有几个串S满足S=a+S1+b+c+S2+d的形式.S1 S2可以为空,并且a+S1+b=c+S2+d. 就搞四颗Trie ...

  7. 【推导】计蒜客17119 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 F. Trig Function

    题意:给你n,m,让你求cos(nx)的展开式的(cos(x))^m项的系数. 更一般的式子是这样的:. 队友的代码: #include<cstdio> #include<algor ...

  8. 【找规律】计蒜客17118 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 E. Maximum Flow

    题意:一张有n个点的图,结点被编号为0~n-1,i往所有编号比它大的点j连边,权值为i xor j.给你n,问你最大流. 打个表,别忘了把相邻两项的差打出来,你会发现神奇的规律……你会发现每个答案都是 ...

  9. 【推导】计蒜客17116 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 C. Sum

    题意:S(x)被定义为x的十进制表示下的数位之和.给你x,让你找一个正整数k,使得S(kx)能被233整除.k不超过2千位. 由于x不超过1000000,不论x是多少,10000000重复233次一定 ...

随机推荐

  1. 【转】关于Scapy

    关于Scapy Scapy的是一个强大的交互式数据包处理程序(使用python编写).它能够伪造 或者解码大量的网络协议数据包,能够发送.捕捉.匹配请求和回复包等等.它可以很容易地处理一些典型操作,比 ...

  2. map,set的底层实现:红黑树[多图,手机慎入]

    最近天下有一种颇不太平的感觉,各地的乱刀砍人,到处是贪官服法.京东准备上市了,阿里最近也提交申请了,猎豹也逆袭了,据说猎豹移动在国际市场上表现甚是抢眼.只有屌丝还在写着代码.花开花又谢,花谢花又开,为 ...

  3. python基础===pendulum '''Python datetimes made easy.'''

    https://pypi.python.org/pypi/pendulum Pendulum的一大优势是内嵌式取代Python的datetime类,可以轻易地将它整合进已有代码,并且只在需要的时候才进 ...

  4. glom模块的使用(一)

    glom模块的使用 简单说下glom模块主要是处理结构化数据用的,安装简单pip install glom即可,下面就glom的方法参数做例子讲解. glom 和模块同名的glom方法使用方法: .g ...

  5. python mysql插入数据遇到的错误

    1.数据插入的时候报错:not enough arguments for format string,大概意思就是说没有足够的参数格式化字符串. 我的数据库插入方法是这样的 def add_data( ...

  6. 2017多校第7场 HDU 6129 Just do it 找规律

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6129 题意:求a序列后m次xor前缀和 解法: 手动对1位置对每个位置的贡献打表发现 第一次 贡献为 ...

  7. 如何在本地用vs调试微信接口

    这段时间在研究微信,看了网上很多都是把项目发布之后在服务器上调试,可以我想可以直接在vs上面设置断点调试 刚开始才用 http://www.cnblogs.com/hanzhaoxin/p/45186 ...

  8. dubbo支持的远程调用方式

    dubbo RPC(二进制序列化 + tcp协议).http invoker(二进制序列化 + http协议,至少在开源版本没发现对文本序列化的支持).hessian(二进制序列化 + http协议) ...

  9. tornado write render redirect IP

    write 用法( self.flush() ) render (跳转指定网页)用法 redirect(跳转指定路由)用法 self.request.remote_ip 显示用户 IP 地址 less ...

  10. 应用程序有bug崩溃重启的案例

    1.程序主界面代码 using System;using System.Collections.Generic;using System.Diagnostics;using System.Linq;u ...