2017 ACM-ICPC 亚洲区(西安赛区)网络赛 xor (根号分治)
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 uuand 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,b and 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
题目来源
【题意】给您一棵树,每个节点有一个权值,q次询问,每次给出u,v,k,求从u到v的路径中,从u开始,每隔k个节点亦或一下的结果。
【分析】根号分治,大于根号n的暴力跳(倍增跳),小于根号n的用数组存起来,复杂度最高为O(N)*sqrt(N)*log(N).
- #include <bits/stdc++.h>
- #define inf 0x3f3f3f3f
- #define met(a,b) memset(a,b,sizeof a)
- #define pb push_back
- #define mp make_pair
- #define rep(i,l,r) for(int i=(l);i<=(r);++i)
- #define inf 0x3f3f3f3f
- using namespace std;
- typedef long long ll;
- const int N = 5e4+;;
- const int M = ;
- const int mod = ;
- const int mo=;
- const double pi= acos(-1.0);
- typedef pair<int,int>pii;
- int n,q,sz;
- int a[N],fa[N][],up[N][M+],dep[N];
- vector<int>edg[N],vec;
- int find(int u,int k){
- for(int i=;i>=;i--){
- if(k>>i&){
- u=fa[u][i];
- if(u==)return ;
- }
- }
- return u;
- }
- void dfs(int u,int f){
- fa[u][]=f;
- for(int i=;i<;i++){
- fa[u][i]=fa[fa[u][i-]][i-];
- }
- for(int i=;i<=sz;i++){
- up[u][i]=a[u];
- int v=find(u,i);
- up[u][i]^=up[v][i];
- }
- for(int i=;i<edg[u].size();i++){
- int v=edg[u][i];
- if(v==f)continue;
- dep[v]=dep[u]+;
- dfs(v,u);
- }
- }
- int LCA(int u,int v){
- int U=u,V=v;
- if(dep[u]<dep[v])swap(u,v);
- for(int i=;i>=;i--){
- if(dep[fa[u][i]]>=dep[v]){
- u=fa[u][i];
- }
- }
- if(u==v)return (u);
- for(int i=;i>=;i--){
- if(fa[u][i]!=fa[v][i]){
- u=fa[u][i];v=fa[v][i];
- }
- }
- return (fa[u][]);
- }
- int solve(int u,int v,int k,int lca){
- int res=(dep[u]+dep[v]-*dep[lca])%k;
- int U=u,V=v;
- v=find(v,res);
- int ans=;
- while(dep[u]>=dep[lca]){
- ans^=a[u];
- u=find(u,k);
- if(!u)break;
- }
- if(V==lca||dep[v]<=dep[lca]||v==)return ans;
- V=v;
- while(dep[v]>=dep[lca]){
- ans^=a[v];
- v=find(v,k);
- if(!v)break;
- }
- if((dep[U]-dep[lca])%k==&&(dep[V]-dep[lca])%k==)ans^=a[lca];
- return ans;
- }
- void init(){
- met(fa,);met(up,);
- for(int i=;i<N;i++){
- edg[i].clear();
- }
- }
- int main(){
- while(~scanf("%d%d",&n,&q)){
- init();
- sz=round(sqrt(n));
- for(int i=,u,v;i<n;i++){
- scanf("%d%d",&u,&v);
- edg[u].pb(v);edg[v].pb(u);
- }
- for(int i=;i<=n;i++)scanf("%d",&a[i]);
- dep[]=;
- dfs(,);
- while(q--){
- int u,v,k;
- scanf("%d%d%d",&u,&v,&k);
- int lca=LCA(u,v),ans=;;
- if(k>sz){
- ans=solve(u,v,k,lca);
- }
- else {
- int dis=dep[u]-dep[lca];
- int s=(dis/k+)*k;
- int x=find(u,s);
- ans=up[u][k]^up[x][k];
- int res=(dep[u]+dep[v]-*dep[lca])%k;
- if(lca!=v&&dep[v]-dep[lca]>res){
- v=find(v,res);
- dis=dep[v]-dep[lca];
- s=(dis/k+)*k;
- x=find(v,s);
- ans^=up[v][k]^up[x][k];
- if((dep[u]-dep[lca])%k==&&(dep[v]-dep[lca])%k==)ans^=a[lca];
- }
- }
- printf("%d\n",ans);
- }
- }
- return ;
- }
2017 ACM-ICPC 亚洲区(西安赛区)网络赛 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 题意: ...
- 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 ...
- 2014ACM/ICPC亚洲区鞍山赛区现场赛1009Osu!
鞍山的签到题,求两点之间的距离除以时间的最大值.直接暴力过的. A - Osu! Time Limit:1000MS Memory Limit:262144KB 64bit IO Fo ...
- [刷题]ACM ICPC 2016北京赛站网络赛 D - Pick Your Players
Description You are the manager of a small soccer team. After seeing the shameless behavior of your ...
随机推荐
- CF839 D 容斥
求$gcd>1$的所有$gcd(a_i,a_{i+1}…a_{n})*(n-i+1)$的和 首先先标记所有出现的数.从高到低枚举一个数k,记录它的倍数出现次数cnt,那么当前所有组合的答案就是$ ...
- LightOJ 1065 - Number Sequence 矩阵快速幂水题
http://www.lightoj.com/volume_showproblem.php?problem=1065 题意:给出递推式f(0) = a, f(1) = b, f(n) = f(n - ...
- dubbo可通过指定Url方式绕过注册中心直连指定的服务地址
开发.测试环境可通过指定Url方式绕过注册中心直连指定的服务地址,避免注册中心中服务过多,启动建立连接时间过长,如: <dubbo:reference id="providerServ ...
- Linux rpm yum 等安装软件
任何程序都是先写代码,拿到源码去编译得到一个目标程序. 1 编译的过程复杂有需要准备编译的环境,和硬件有关,32位64位,内核的不同等等所以需要编译多次 Java特殊但是他需要安装jvm, ...
- Map集合的两种取出方式
Map集合有两种取出方式, 1.keySet:将Map中的键存入Set集合,利用set的迭代器来处理所有的键 举例代码如下: import java.util.*; class Test { publ ...
- BestCoder Round #41 记。
大概整个过程都是很绝望的吧. 发现自己在七点之前是肯定搞不定网了..有冲动跑到机房去打 但是又不喜欢那样的气氛 这可是shi的场呢...好难过啊... 后来..好像是在和lyd讨论怎么把网络复原的过程 ...
- mysql跨节点join——federated引擎
一. 什么是federated引擎 mysql中的federated类似于oracle中的dblink. federated是一个专门针对远程数据库的实现,一般情况下在本地数据库中建表会在数据库目录中 ...
- html 中的列表
html 中列表可以分为 1. 无序列表(ul--li 的形式) 2. 有序列表(ol li的形式) 3. 定义列表(dl 的形式) 下面来看几种列表的具体内容: 1.无序列表. 无序列表的格式 ...
- 设计模式之Adapter
设计模式总共有23种模式这仅仅是为了一个目的:解耦+解耦+解耦...(高内聚低耦合满足开闭原则) 介绍: 将两个不兼容的类纠合在一起使用,属于结构型模式,也有人称它为wrapper(包装类). 包装类 ...
- SQLite3数据库的操作
数据库的操作 我们在这个项目中使用的是SQLITE3数据库软件. 通过使用SQLITE3进行创建数据库,创建表,插入记录,查询记录,更新记录,关闭数据库等操作来实现将相应的数据存入数据库中. 打开数据 ...