在树的路径上选取一些点 使得这些点权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 倍增维护线性基的更多相关文章

  1. 【bzoj4568】[Scoi2016]幸运数字 树上倍增+高斯消元动态维护线性基

    题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征.一些旅行者希望游 ...

  2. bzoj 4184: shallot (线段树维护线性基)

    题面 \(solution:\) 这一题绝对算的上是一道经典的例题,它向我们诠释了一种新的线段树维护方式(神犇可以跳过了).像这一类需要加入又需要维护删除的问题,我们曾经是遇到过的像莫对,线段树... ...

  3. BZOJ 2460 [BeiJing2011]元素 ——线性基

    [题目分析] 线性基,由于最多有63个,只需要排序之后,动态的去维护线性基即可. [代码] #include <cstdio> #include <cstring> #incl ...

  4. 【BZOJ-2460&3105】元素&新Nim游戏 动态维护线性基 + 贪心

    3105: [cqoi2013]新Nim游戏 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 839  Solved: 490[Submit][Stat ...

  5. 【bzoj4184】shallot 线段树+高斯消元动态维护线性基

    题目描述 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且 让小葱从自己手中的小 ...

  6. BZOJ_4184_shallot_线段树按时间分治维护线性基

    BZOJ_4184_shallot_线段树按时间分治维护线性基 Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻 ...

  7. 「洛谷3292」「BZOJ4568」「SCOI2016」幸运数字【倍增LCA+线性基+合并】

    [bzoj数据下载地址]不要谢我 先讲一下窝是怎么错的... \(MLE\)是因为数组开小了.. 看到异或和最大,那么就会想到用线性基. 如果不会线性基的可以参考一下我的学习笔记:「线性基」学习笔记a ...

  8. Wannafly挑战赛14 - E 并查集维护线性基区间

    给一个1-base数组{a},有N次操作,每次操作会使一个位置无效.一个区间的权值定义为这个区间里选出一些数的异或和的最大值.求在每次操作前,所有不包含无效位置的区间的权值的最大值. 线性基删除不知道 ...

  9. BZOJ 2460: [BeiJing2011]元素 线性基

    2460: [BeiJing2011]元素 Description 相传,在远古时期,位于西方大陆的 Magic Land 上,人们已经掌握了用魔法矿石炼制法杖的技术.那时人们就认识到,一个法杖的法力 ...

随机推荐

  1. Sort和UnSort的小技巧

    Sort和UnSort的小技巧: 记录sortidx,对sortidx再从小到大排序就可以得到用于还原的unsortidx. 对于序列A: sort_idx = np.argsort(A) un_so ...

  2. Noip前紧急抢救

    管他会不会,知道结论就好了 紧急抢救知识 斯特林数 第一类斯特林数 递推公式 \[ S[n][k]=(n-1)\times S[n-1][k]+S[n-1][k-1] \] 处理的问题是将n个数划分为 ...

  3. 制作ubuntu的U盘启动盘

    在制作U盘启动盘之前,请各位先格式化你的U盘. 制作U盘启动盘的工具有很多种,我们这里为大家介绍的是用软碟通制作.所有我们需要有这个软件,如果大家没有可以百度“软碟通”,下载安装一个.然后点击打开.在 ...

  4. 微信小程序遇坑笔记

    最近做了一个简单的微信小程序,遇到了一些坑: 1.appid固定,但是appsecret是可以变的,而且没有地方查看,后台以查看就是变更了,所以这个地方在开发的时候需要保存好: 2.打开网页,这个网页 ...

  5. 手机号获取省份,城市api的使用

    function get_mobile_area($mobile){ header('Content-Type:text/html;charset=gbk'); $url = 'http://life ...

  6. uva 11082 Matrix Decompressing 【 最大流 】

    只看题目的话~~怎么也看不出来是网络流的题目的说啊~~~~ 建图好神奇~~ 最开始不懂---后来看了一下这篇-- http://www.cnblogs.com/AOQNRMGYXLMV/p/42807 ...

  7. poj 2828 Buy Tickets【线段树 单点更新】

    倒着插,先不理解意思,后来看一篇题解说模拟一下 手动模拟一下就好理解了----- 不过话说一直写挫---一直改啊----- 好心塞------ #include <cstdio> #inc ...

  8. GFM(GitHub Flavored Markdown)与标准Markdown的语法区别

    没有就自己造 其实这篇文16年底的时候就写好的,只不过当时是记在自己的笔记上(没错,我笔记大多记在本地,比发表的这寥寥几篇那是多的多的多了

  9. layui动态修改select的选中项

    layui动态修改select的选中项:(在layUI下给select设置默认选项) 例: $("select[name='result']").val(11); //重新渲染表单 ...

  10. Pyhton学习——Day48

    # 转载:http://www.cnblogs.com/yuanchenqi/articles/6437362.html#python关于mysql的API--pymysql模块# 执行sql语句# ...