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--400A--Inna and Choose Options(模拟水题)
Inna and Choose Options Crawling in process... Crawling failed Time Limit:1000MS Memory Limit:26 ...
- B1090 [SCOI2003]字符串折叠 区间dp
又一道区间dp,和上一篇类似,但是比他简单,这个只有两种转移方法,不是很复杂.直接判断是否为重复的串就行. 题干: Description 折叠的定义如下: . 一个字符串可以看成它自身的折叠.记作S ...
- codevs1005生日礼物(dfs)
1005 生日礼物 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 9月12日是小松的朋友小寒的生日.小松知道小寒特别 ...
- codevs1163访问艺术馆(树形dp)
1163 访问艺术馆 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 皮尔是一个出了名的盗画者,他经过数月的精心准备, ...
- 爬虫—Ajax数据爬取
一.什么是Ajax 有时候我们使用浏览器查看页面正常显示的数据与使用requests抓取页面得到的数据不一致,这是因为requests获取的是原始的HTML文档,而浏览器中的页面是经过JavaScri ...
- PHP网站 通过js方式判断是否是手机访问,若是 跳转到手机版网址!
<script type="text/javascript" src="http://i3.dukuai.com/ui/js/jquery-1.32pack.js& ...
- [转]Android定时刷新UI界面----Handler
本文转自:http://blog.csdn.net/macong01/article/details/7479266 本想做一个软件可以对UI界面进行定时更新,找了一些资料,先贴一个简单的定时更新界面 ...
- Laravel5.1学习笔记i14 系统架构6 Facade
Facades 介绍 使用 Facades Facade 类参考 #介绍 Facades provide a "static" interface to classes th ...
- 淘宝ip地址库接口会导致TTFB时间变长,网站打开速度变慢
前一段时间闲来无事发现别人的网站上有显示当前用户城市的功能,就自己也整了一个 这是淘宝ip地址库调用方法 然后问题就出现了,网站打开速度慢的要死 用F12发现是TTFB太慢,然后百度了,发现了问题的原 ...
- Google开源技术protobuf
1.protobuf简介 protobuf是google提供的一个开源序列化框架,类似于XML,JSON这样的数据表示语言,其最大的特点是基于二进制,因此比传统的XML表示高效短小得多.虽然是二进制数 ...