2017 ACM-ICPC 亚洲区(西安赛区)网络赛 G. Xor
There is a tree with nn nodes. For each node, there is an integer value a_iai, (1 \le a_i \le 1,000,000,0001≤ai≤1,000,000,000 for 1 \le i \le n1≤i≤n). There is qq queries which are described as follow: Assume the value on the path from node aa to node bb is t_0, t_1, \cdots t_mt0,t1,⋯tm. You are supposed to calculate t_0t0 xor t_ktk xor t_{2k}t2k xor ... xor t_{pk}tpk (pk \le m)(pk≤m).
Input Format
There are multi datasets. (\sum n \le 50,000, \sum q \le 500,000)(∑n≤50,000,∑q≤500,000).
For each dataset: In the first n-1n−1 lines, there are two integers u,vu,v, indicates there is an edge connect node uu and node vv.
In the next nn lines, There is an integer a_iai (1 \le a_i \le 1,000,000,0001≤ai≤1,000,000,000).
In the next qq lines, There is three integers a,ba,band kk. (1 \le a,b,k \le n1≤a,b,k≤n).
Output Format
For each query, output an integer in one line, without any additional space.
样例输入
5 6
1 5
4 1
2 1
3 2
19
26
0
8
17
5 5 1
1 3 2
3 2 1
5 4 2
3 4 4
1 4 5
样例输出
17
19
26
25
0
19
分析:求树上路径从距离起点为k的倍数的权值和;
大于根号n暴力,小于的话预处理,处理到根的前缀异或和;
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <climits>
#include <cstring>
#include <string>
#include <set>
#include <bitset>
#include <map>
#include <queue>
#include <stack>
#include <vector>
#include <cassert>
#include <ctime>
#define rep(i,m,n) for(i=m;i<=(int)n;i++)
#define inf 0x3f3f3f3f
#define mod 1000000007
#define vi vector<int>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ll long long
#define pi acos(-1.0)
#define pii pair<int,int>
#define sys system("pause")
#define ls (rt<<1)
#define rs (rt<<1|1)
#define all(x) x.begin(),x.end()
const int maxn=5e4+;
const int N=2e5+;
using namespace std;
ll gcd(ll p,ll q){return q==?p:gcd(q,p%q);}
ll qmul(ll p,ll q,ll mo){ll f=;while(q){if(q&)f=(f+p)%mo;p=(p+p)%mo;q>>=;}return f;}
ll qpow(ll p,ll q,ll mo){ll f=;while(q){if(q&)f=f*p%mo;p=p*p%mo;q>>=;}return f;}
int n,m,k,t,dp[maxn][],fa[][maxn],dep[maxn],a[maxn],sz,q,head[maxn],tot;
struct node
{
int to,nxt;
}e[maxn<<];
void add(int x,int y)
{
e[tot].to=y;
e[tot].nxt=head[x];
head[x]=tot++;
}
int lca(int x,int y)
{
int i;
if(dep[x]<dep[y])swap(x,y);
for(i=;i>=;i--)if(dep[fa[i][x]]>=dep[y])x=fa[i][x];
if(x==y)return x;
for(i=;i>=;i--)
{
if(fa[i][x]!=fa[i][y])
{
x=fa[i][x],
y=fa[i][y];
}
}
return fa[][x];
}
int find(int x,int y)
{
int i;
for(i=;i>=;i--)
{
if(y>>i&)
{
x=fa[i][x];
if(x==)return ;
}
}
return x;
}
void dfs(int x,int y)
{
int i;
dep[x]=dep[y]+;
for(i=;fa[i-][fa[i-][x]];i++)
{
fa[i][x]=fa[i-][fa[i-][x]];
}
rep(i,,sz)
{
dp[x][i]=a[x];
dp[x][i]^=dp[find(x,i)][i];
}
for(i=head[x];i!=-;i=e[i].nxt)
{
int z=e[i].to;
if(z==y)continue;
fa[][z]=x;
dfs(z,x);
}
}
int main(){
int i,j;
while(~scanf("%d%d",&n,&q))
{
sz=round(sqrt(n));
rep(i,,n)
{
head[i]=-;
rep(j,,)fa[j][i]=;
}
tot=;
rep(i,,n-)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
rep(i,,n)scanf("%d",&a[i]);
dfs(,);
while(q--)
{
int x,y,k;
int ret=;
scanf("%d%d%d",&x,&y,&k);
if(x==y)
{
printf("%d\n",a[x]);
continue;
}
int fa=lca(x,y),len=dep[x]+dep[y]-*dep[fa],pos;
if((dep[x]-dep[fa])%k==&&fa!=x&&fa!=y)ret^=a[fa];
if(k>sz)
{
if(fa!=x)
{
pos=x;
ret^=a[pos];
while(dep[j=find(pos,k)]>=dep[fa])
{
pos=j;
ret^=a[pos];
}
}
if(fa!=y)
{
pos=find(y,len%k);
if(dep[pos]>=dep[fa])
{
ret^=a[pos];
while(dep[j=find(pos,k)]>=dep[fa])
{
pos=j;
ret^=a[pos];
}
}
}
}
else
{
int len1=dep[x]-dep[fa];
if(fa!=x)
{
len1=len1/k*k;
pos=find(x,len1);
ret=(ret^dp[x][k]^dp[pos][k]^a[pos]);
}
if(fa!=y)
{
int st=find(y,len%k);
if(dep[st]>=dep[fa])
{
len1=dep[st]-dep[fa];
len1=len1/k*k;
pos=find(st,len1);
ret=(ret^dp[st][k]^dp[pos][k]^a[pos]);
}
}
}
printf("%d\n",ret);
}
}
return ;
}
/*
6 1
3 2
1 4
4 6
6 2
1 5
60
2
75
34
60
15
4 6 1
ans:45
*/
2017 ACM-ICPC 亚洲区(西安赛区)网络赛 G. Xor的更多相关文章
- HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛)
HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛) Panda Time Limit: 10000/4000 MS (Java/Others) Memory Limit: ...
- 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 ...
- 2016 ACM/ICPC亚洲区青岛站现场赛(部分题解)
摘要 本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛. HDU 5 ...
- ICPC 2018 徐州赛区网络赛
ACM-ICPC 2018 徐州赛区网络赛 去年博客记录过这场比赛经历:该死的水题 一年过去了,不被水题卡了,但难题也没多做几道.水平微微有点长进. D. Easy Math 题意: ...
- 【分块】计蒜客17120 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 G. Xor
题意:给一棵树,每个点有权值.q次询问a,b,k,问你从a点到b点,每次跳距离k,权值的异或和? 预处理每个点往其根节点的路径上隔1~sqrt(n)的距离的异或和,然后把询问拆成a->lca(a ...
- Skiing 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛H题(拓扑序求有向图最长路)
参考博客(感谢博主):http://blog.csdn.net/yo_bc/article/details/77917288 题意: 给定一个有向无环图,求该图的最长路. 思路: 由于是有向无环图,所 ...
- [刷题]ACM/ICPC 2016北京赛站网络赛 第1题 第3题
第一次玩ACM...有点小紧张小兴奋.这题目好难啊,只是网赛就这么难...只把最简单的两题做出来了. 题目1: 代码: //#define _ACM_ #include<iostream> ...
- 2017 ACM/ICPC(西安)赛后总结
早上8:00的高铁,所以不得不6点前起床,向火车站赶……到达西安后已经是中午,西工大距离西安北站大概3小时车程的距离,只好先解决午饭再赶路了……下午3.30的热身赛,一行人在3.35左右赶到了赛场,坐 ...
- 2016 ACM/ICPC亚洲区大连站-重现赛 解题报告
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=5979 按AC顺序: I - Convex Time limit 1000 ms Memory li ...
随机推荐
- CodeForces - 556D
D. Case of Fugitive time limit per test 3 seconds memory limit per test 256 megabytes input standard ...
- NodeJs函数式编程
虽然标题是NodeJS函数式编程,但实际上NodeJS 是一个框架,不是一种语言,其采用的语言是 JavaScript.而JavaScript是一种典型的多范式编程语言,算不上是函数式语言,但它有函数 ...
- 在PL/SQL使用游标获取数据及动态SQL
1.游标概念: 当在PL/SQL块中执行DML(增删改)时,Oracle会为其分配上下文区(Context Area),游标是指向上下文区的指针 2. 游标分类: A. 隐式游标 a. 在PL/ ...
- CentOS7 iso封装语句
mkisofs -o /srv/neutron-controller.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot - ...
- ubuntu系统快捷键设置
1.打开'系统设置' 2.点击键盘 3.选择快捷键,查看和修改对应的快捷键.
- PCB 所建不凡 AWS 技术峰会2018 • 深圳站 2018.9.20
在去[AWS 技术峰会2018 • 深圳站]之提前并没有AWS提前做功课,主要PCB这行业基本自己搭服务器搭应用,不会买云服务器.由于没用过企业级的云服务器,对云这方面还是了解还是非常有限的. 市面上 ...
- 北大zhw大神bzoj1756代码
#include <cmath> #include <cstdio> #include <cstdlib> #include <iostream> #i ...
- VUE使用QRcode或者vue-qr生成二维码
这里介绍两种vue生成二维码的方法 QRcode vue-qr vue-qr比QRcode功能多在可以在中间加logo 下面先介绍QRcode vue里安装qrcodejs的npm包 npm inst ...
- printf的字符型
参 数 说 明 %s 按实际宽度输出一个字符串 %ms m指定宽度(不足时左补空格,大于时按实际宽度输出) %-ms 左对齐,不足时右补空格 %m.ns 输出占m个字符位置,其中字符数最多n个,左 ...
- pip使用豆瓣镜像源
pip使用豆瓣的镜像源 豆瓣镜像地址: https://pypi.douban.com/simple/ 虽然用easy_install和pip来安装第三方库很方便 他们的原理其实就是从Python的官 ...