2017 ACM-ICPC 亚洲区(西安赛区)网络赛 Xor
来源:互联网 发布:外文数据库 编辑:程序博客网 时间:2024/06/06 01:02
题意:
给出树的u,v节点询问每隔K个取一个数字异或。
思路:
是卡过去的。。竟然没TLE。
找U点和V点的LCA,之后从U点先向上用ST算法找到第K个祖先,依次类推。 之后再V点再重新处理向上找。注意在找完U后,可能LCA并不是K的位置。因此V点的起始位置要特判
#include<bits/stdc++.h>using namespace std;#define rank Rank#define pb push_back#define fi first#define se second#define MAXN 100050#define inf 0x3f3f3f3fint dep[MAXN];int pre[20][MAXN] ;int n,m;int num[MAXN];vector<int>vec[MAXN];int a[MAXN];int numlen[MAXN];void dfs(int u, int fa){ dep[u] = dep[fa] + 1; for(int i=0; i<vec[u].size(); i++) { int v = vec[u][i]; if(v == fa) continue; dfs(v, u); pre[0][v] = u; }}int lca(int u, int v, int MAX){ if(dep[u] < dep[v]) swap(u, v); int k = dep[u] - dep[v]; for(int i=0; i<MAX; i++) { if((k>>i)&1) u = pre[i][u]; } if(u == v)return u; for(int i=MAX-1; i>=0; i--) while(pre[i][u] != pre[i][v]) { u = pre[i][u]; v = pre[i][v]; } return pre[0][u];}int main(){ int q,u,v; while(~scanf("%d%d",&n,&q)) { for(int i=1;i<=n;i++) vec[i].clear(); for(int i=1; i<n; i++) { scanf("%d%d",&u,&v); vec[u].push_back(v); vec[v].push_back(u); } dep[1] = 1; dfs(1, 0); int k = 0,t = 1; while(t <= n)t <<= 1,k++; for(int i=0; i+1<k; i++) { for(int j=1; j<=n; j++) { pre[i+1][j] = pre[i][pre[i][j]]; } } for(int i=1; i<=n; i++) { scanf("%d",&a[i]); } int kk; while(q--) { scanf("%d%d%d",&u,&v,&kk); int Lca=lca(u,v,k); int len=dep[u]+dep[v]-dep[Lca]*2; int now=u; int ans=a[u],cnt=0; int kkk=kk; while(kk!=0) { if(kk&1) num[cnt]=1; else num[cnt]=0; cnt++; kk>>=1; } while(dep[now]>=dep[Lca]) { for(int i=cnt-1; i>=0; i--) { if(num[i]==1) { now=pre[i][now]; } } if(dep[now]<dep[Lca]) break; ans^=a[now]; } ///vvv now=v; len=len%kkk; if(dep[v]-dep[Lca]>len) { int cntlen=0; while(len!=0) { if(len&1) numlen[cntlen]=1; else numlen[cntlen]=0; cntlen++; len>>=1; } if(dep[now]>=dep[Lca]) { for(int i=cntlen-1; i>=0; i--) { if(numlen[i]==1) { now=pre[i][now]; } } } ///kk ans^=a[now]; while(dep[now]>=dep[Lca]) { for(int i=cnt-1; i>=0; i--) { if(num[i]==1) { now=pre[i][now]; } } if(dep[now]<=dep[Lca]) break; ans^=a[now]; } } printf("%d\n",ans); } }}
阅读全文
4 0
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 Xor
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 Xor
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 G Xor lca+暴力
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 G. Xor [LCA+分块]
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 G. Xor
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 Coin
- 2017 ACM-ICPC 亚洲区(西安赛区)网络...
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 B. Coin(概率)
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 B Coin (概率计算)
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 B. Coin(矩阵快速幂)
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 Coin(组合数)
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 B Coin (概率计算)
- java 加密
- 并查集(入门篇)
- Android7.0检查权限
- Springboot系列:Springboot与Thymeleaf模板引擎整合基础教程(附源码)
- new和malloc的区别
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 Xor
- Oracle第一次测试分析
- centos svn服务端的部署和同步web端
- docker mysql 主从复制实践(亲测可行)
- getContextPath、getServletPath、getRequestURL、getRealPath的区别
- Thrift之C++ 异步连接池实例
- spring boot 加入 spring-security配置 角色前缀 静态资源访问
- tf.squeeze() Function函数作用
- 前端相关面试题总结