[BZOJ4568][Scoi2016]幸运数字 倍增+线性基
4568: [Scoi2016]幸运数字
Time Limit: 60 Sec Memory Limit: 256 MB
Submit: 1791 Solved: 685
[Submit][Status][Discuss]
Description
Input
Output
输出需要包含 q 行,每行包含 1 个非负整数,表示这名旅行者可以保留的最大幸运值。
Sample Input
11 5 7 9
1 2
1 3
1 4
2 3
1 4
Sample Output
11
HINT
Source
树上倍增维护线性基
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define maxn 20005
#define ll long long
using namespace std;
ll fa[maxn][],s[maxn][][];
ll n,q,a[maxn];
ll tmp[];
int dep[maxn];
struct data {
int to,next;
}e[maxn*];
int head[maxn],cnt;
void add(int u,int v) {e[cnt].next=head[u];e[cnt].to=v;head[u]=cnt++;}
void build(ll *t1,ll t2) {
for(int i=;i>=;i--) {
if((t2>>i)&1ll) {
if(!t1[i]) {t1[i]=t2;return;}
else t2^=t1[i];
}
}
}
void merge(ll *t1,ll *t2) {for(int i=;i>=;i--) if(t2[i]) build(t1,t2[i]);}
void dfs(int x,int f) {
dep[x]=dep[f]+;
build(s[x][],a[x]);
for(int i=;i<=;i++) fa[x][i]=fa[fa[x][i-]][i-];
for(int i=;i<=;i++) {
memcpy(s[x][i],s[x][i-],sizeof(s[x][i-]));
merge(s[x][i],s[fa[x][i-]][i-]);
}
for(int i=head[x];i>=;i=e[i].next) {
int to=e[i].to;if(to==f) continue;
fa[to][]=x;
dfs(to,x);
}
} int lca(int x,int y) {
if(dep[x]<dep[y]) swap(x,y);
int t=dep[x]-dep[y];
for(int i=;i>=;i--) if((t>>i)&) {merge(tmp,s[x][i]);x=fa[x][i];}
for(int i=;i>=;i--) if(fa[x][i]!=fa[y][i]) {merge(tmp,s[x][i]);merge(tmp,s[y][i]);x=fa[x][i],y=fa[y][i];}
if(x==y) return x;
merge(tmp,s[x][]);merge(tmp,s[y][]);
return fa[x][];
} int main() {
memset(head,-,sizeof(head));
scanf("%lld%lld",&n,&q);
for(int i=;i<=n;i++) scanf("%lld",&a[i]);
for(int i=;i<n;i++) {
int u,v;
scanf("%d%d",&u,&v);add(u,v);add(v,u);
}
dfs(,);
for(int i=;i<=q;i++) {
memset(tmp,,sizeof(tmp));
int x,y;
scanf("%d%d",&x,&y);
int z=lca(x,y);merge(tmp,s[z][]);
ll ans=;
for(int j=;j>=;j--) ans=max(ans,ans^tmp[j]);
printf("%lld\n",ans);
}
}
[BZOJ4568][Scoi2016]幸运数字 倍增+线性基的更多相关文章
- 【BZOJ4568】[Scoi2016]幸运数字 倍增+线性基
[BZOJ4568][Scoi2016]幸运数字 Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念 ...
- bzoj4568: [Scoi2016]幸运数字(LCA+线性基)
4568: [Scoi2016]幸运数字 题目:传送门 题解: 好题!!! 之前就看过,当时说是要用线性基...就没学 填坑填坑: %%%线性基 && 神犇 主要还是对于线性基的运用和 ...
- BZOJ 4568: [Scoi2016]幸运数字(倍增+线性基)
传送门 解题思路 异或最大值肯定线性基了,树上两点那么就倍增搞一搞,就维护每个点到各级祖先的线性基,时间复杂度\(O(nlog^3n)\),并不知道咋过去的. 代码 #include<iostr ...
- 【BZOJ4568】幸运数字(线性基,树链剖分,ST表)
[BZOJ4568]幸运数字(线性基,树链剖分,ST表) 题面 BZOJ Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市 ...
- [BZOJ4568][SCOI2016]幸运数字(倍增LCA,点分治+线性基)
4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 2131 Solved: 865[Submit][Statu ...
- [SCOI2016]幸运数字(线性基,倍增)
[SCOI2016]幸运数字 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作 ...
- 【BZOJ 4568】 4568: [Scoi2016]幸运数字 (线性基+树链剖分+线段树)
4568: [Scoi2016]幸运数字 Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个 幸运数字,以纪念碑的形 ...
- 【bzoj4568】【Scoi2016】幸运数字 (线性基+树上倍增)
Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征.一 ...
- 2019.03.25 bzoj4568: [Scoi2016]幸运数字(倍增+线性基)
传送门 题意:给你一棵带点权的树,多次询问路径的最大异或和. 思路: 线性基上树?? 倍增维护一下就完了. 时间复杂度O(nlog3n)O(nlog^3n)O(nlog3n) 代码: #include ...
随机推荐
- HashSet如何判定两个元素相同
在介绍java的集合时,我们提到,set是一个"罐子".我们可以向其中放入各式各样的元素,这些元素没有顺序,但不能相同.其中,HashSet是最常用的一个实现类. 首先,我们看下H ...
- javascript中将整数添加千位符号
如果num是整数的话,将其转换成带千位符号的字符串: Number(num).toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1' + ','); 另 ...
- mac tomcat: error 1 operation not permitted
在用微信传一个tomcat压缩包到别人后,解压后无法用idea启动,提示 error 1 operation not permitted,但是直接用命令可以执行. 仔细查看,原来是因为mac出于安全考 ...
- 【AtCoder ARC076】F Exhausted? 霍尔定理+线段树
题意 N个人抢M个椅子,M个椅子排成一排 ,第i个人只能坐[1,Li]∪[Ri,M],问最多能坐多少人 $i$人连边向可以坐的椅子构成二分图,题意即是求二分图最大完美匹配,由霍尔定理,答案为$max( ...
- P1140 相似基因
题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了4种核苷酸,简记作A,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. 在一个人类基因工作组的任务中,生物学家研究 ...
- 有用的Java注解
好处: 能够读懂别人的代码,特别是框架相关的代码: 让编程更加简洁,代码更加清晰. 使用自定义注解解决问题!! Java1.5版本引入. Java中的常见注解 @Override:告诉使用者及编译器, ...
- AGC017C Snuke and Spells(巧妙的线段覆盖模型)
题目大意: 给出n个球,每个球上都有数字,然后每次都进行如下操作 如果当前的球总共有k个,那么就把球上数字为k的所有球都消除掉 注意到,并不是每种情况都可以全部消光,所以你可以选择若干球,把它们标号改 ...
- [ZOJ3899]State Reversing
[ZOJ3899]State Reversing 试题描述 Yakumo Yukari is with no doubt one of the most powerful youkai in Gens ...
- [洛谷P1887]乘积最大3
题目大意:请你找出$m$个和为$n$的正整数,他们的乘积要尽可能的大.输出字典序最小的方案 题解:对于一些数,若它们的和相同,那么越接近它们的乘积越大. 卡点:无 C++ Code: #include ...
- [codeforces] 633C Spy Syndrome 2
原题 Trie树+dp 首先,我们可以简单的想到一种dp方式,就是如果这一段可以匹配并且可以与前一段接上,那么更新dp[i]为当前字符串的编号,然后倒推就可以得到答案. 但是,显然我们不能O(m)比较 ...