BZOJ 4568 倍增维护线性基
在树的路径上选取一些点 使得这些点权xor后的结果最大
思路:
时限60s 59696ms卡过去了哈哈哈
//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N=20005;
ll Temp[128],ans;
int n,q,first[N],next[N],v[N],tot,xx,yy,deep[N];
void add(int x,int y){v[tot]=y,next[tot]=first[x],first[x]=tot++;}
struct Node{int anc,num;ll eli[62];}fa[N][16],G[N],jy;
int Gauss(Node a,Node b){
int num=a.num+b.num,flag=1;
for(int i=1;i<=a.num;i++)Temp[i]=a.eli[i];
for(int i=1;i<=b.num;i++)Temp[i+a.num]=b.eli[i];
for(int i=60,j;~i;i--){
for(j=flag;j<=num;j++)if(Temp[j]&(1ll<<i))break;
if(j==num+1)continue;
swap(Temp[flag],Temp[j]);
for(int k=1;k<=num;k++)if(k!=flag&&Temp[k]&(1ll<<i))Temp[k]^=Temp[flag];
flag++;
}
return flag-1;
}
void dfs(int x){
for(int i=1;i<=15;i++){
fa[x][i].anc=fa[fa[x][i-1].anc][i-1].anc;
fa[x][i].num=Gauss(fa[x][i-1],fa[fa[x][i-1].anc][i-1]);
for(int j=1;j<=fa[x][i].num;j++)fa[x][i].eli[j]=Temp[j];
}
for(int i=first[x];~i;i=next[i]){
if(v[i]!=fa[x][0].anc){
fa[v[i]][0].anc=x,deep[v[i]]=deep[x]+1;
fa[v[i]][0].num=Gauss(G[v[i]],G[x]);
for(int j=1;j<=fa[v[i]][0].num;j++)fa[v[i]][0].eli[j]=Temp[j];
dfs(v[i]);
}
}
}
void LCA(int x,int y){
if(deep[x]<deep[y])swap(x,y);
for(int i=15;~i;i--)if(deep[x]-(1<<i)>=deep[y]){
jy.num=Gauss(jy,fa[x][i]);
for(int j=1;j<=jy.num;j++)jy.eli[j]=Temp[j];
x=fa[x][i].anc;
}
if(x==y){jy.num=Gauss(jy,G[x]);for(int j=1;j<=jy.num;j++)jy.eli[j]=Temp[j];return;}
for(int i=15;~i;i--){
if(fa[x][i].anc!=fa[y][i].anc){
jy.num=Gauss(jy,fa[x][i]);
for(int j=1;j<=jy.num;j++)jy.eli[j]=Temp[j];
jy.num=Gauss(jy,fa[y][i]);
for(int j=1;j<=jy.num;j++)jy.eli[j]=Temp[j];
x=fa[x][i].anc,y=fa[y][i].anc;
}
}
jy.num=Gauss(jy,fa[x][0]);
for(int j=1;j<=jy.num;j++)jy.eli[j]=Temp[j];
jy.num=Gauss(jy,fa[y][0]);
for(int j=1;j<=jy.num;j++)jy.eli[j]=Temp[j];
}
int main(){
memset(first,-1,sizeof(first));
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)scanf("%lld",&G[i].eli[1]),G[i].num=1;
for(int i=1;i<n;i++)scanf("%d%d",&xx,&yy),add(min(xx,yy),max(xx,yy));
deep[1]=1,dfs(1);
for(int i=1;i<=q;i++){
scanf("%d%d",&xx,&yy);
jy.num=ans=0,LCA(xx,yy);
for(int i=1;i<=jy.num;i++)ans^=jy.eli[i];
printf("%lld\n",ans);
}
}
BZOJ 4568 倍增维护线性基的更多相关文章
- 【bzoj4568】[Scoi2016]幸运数字 树上倍增+高斯消元动态维护线性基
题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征.一些旅行者希望游 ...
- bzoj 4184: shallot (线段树维护线性基)
题面 \(solution:\) 这一题绝对算的上是一道经典的例题,它向我们诠释了一种新的线段树维护方式(神犇可以跳过了).像这一类需要加入又需要维护删除的问题,我们曾经是遇到过的像莫对,线段树... ...
- BZOJ 2460 [BeiJing2011]元素 ——线性基
[题目分析] 线性基,由于最多有63个,只需要排序之后,动态的去维护线性基即可. [代码] #include <cstdio> #include <cstring> #incl ...
- 【BZOJ-2460&3105】元素&新Nim游戏 动态维护线性基 + 贪心
3105: [cqoi2013]新Nim游戏 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 839 Solved: 490[Submit][Stat ...
- 【bzoj4184】shallot 线段树+高斯消元动态维护线性基
题目描述 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且 让小葱从自己手中的小 ...
- BZOJ_4184_shallot_线段树按时间分治维护线性基
BZOJ_4184_shallot_线段树按时间分治维护线性基 Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻 ...
- 「洛谷3292」「BZOJ4568」「SCOI2016」幸运数字【倍增LCA+线性基+合并】
[bzoj数据下载地址]不要谢我 先讲一下窝是怎么错的... \(MLE\)是因为数组开小了.. 看到异或和最大,那么就会想到用线性基. 如果不会线性基的可以参考一下我的学习笔记:「线性基」学习笔记a ...
- Wannafly挑战赛14 - E 并查集维护线性基区间
给一个1-base数组{a},有N次操作,每次操作会使一个位置无效.一个区间的权值定义为这个区间里选出一些数的异或和的最大值.求在每次操作前,所有不包含无效位置的区间的权值的最大值. 线性基删除不知道 ...
- BZOJ 2460: [BeiJing2011]元素 线性基
2460: [BeiJing2011]元素 Description 相传,在远古时期,位于西方大陆的 Magic Land 上,人们已经掌握了用魔法矿石炼制法杖的技术.那时人们就认识到,一个法杖的法力 ...
随机推荐
- shell脚本创建和执行
shell脚本并不能作为正式的编程语言,因为它是在Linux的shell中运行的,所以称他为shell脚本. 事实上,shell脚本就是一些命令的集合. 我们不妨吧所有的操作都记录到一个文档中,然后去 ...
- 【刷题笔记】LeetCode 222. Count Complete Tree Nodes
题意 给一棵 complete binary tree,数数看一共有多少个结点.做题链接 直观做法:递归 var countNodes = function(root) { if(root===nul ...
- Linux top命令简解
简介: top 命令是最流行的性能监视工具之一,它是一个优秀的交互式工具,用于监视性能.它提供系统整体性能,但报告进程信息才是 top 命令的长处. top 界面分为两个部份,光标上面部份显示关于系统 ...
- DOM相关知识点
内容待补充... DOM相关注意题目: DOM的最小组成单位叫做 //节点 Node DOM 有自己的国际标准,目前的通用版本是 //DOM 3 DOM 树的根节点 //HTML 元素 Element ...
- javascript中菜单栏切换案例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- log4j:WARN Please initialize the log4j system properly.解决方案
在使用quarz任务调度框架时的错误,实际上这个问题很常见,并不影响程序的使用,只是缺少日志输出,完整错误信息: log4j:WARN No appenders could be found for ...
- SwipeRefreshLayout的使用,下拉刷新
1. <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android ...
- java处理日期时间代码
public static String FORMATE_DATE_STR = "yyyy-MM-dd"; public static String FORMATE_TIME_ST ...
- PHP学习过程中遇到的疑难杂症
变量当双引号中包含变量时,变量会与双引号中的内容连接在一起:当单引号中包含变量时,变量会被当做字符串输出. Heredoc结构形式首先使用定界符表示字符串(<<<),接着在“< ...
- Lambda 表达式-即匿名函数
拉姆达值(Lambda),希腊字母表示为Λ,指与真空的空间有关的能量或暗能量. 代表转换的常量.或者转换本身. Lambda 表达式 Lambda 表达式”是一个匿名函数,可以包含表达式和语句 ...