幸运数字(luckly)

题目描述

A国共有 nn 座城市,这些城市由

TeX parse error: Misplaced &

条道路相连,使得任意两座城市可以互达,且路径唯一。每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征。

一些旅行者希望游览A国。旅行者计划乘飞机降落在 xx 号城市,沿着 xx 号城市到 yy 号城市之间那条唯一的路径游览,最终从 yy 城市起飞离开A国。在经过每一座城市时,游览者就会有机会与这座城市的幸运数字拍照,从而将这份幸运保存到自己身上。

然而,幸运是不能简单叠加的,这一点游览者也十分清楚。他们迷信着幸运数字是以异或的方式保留在自己身上的。例如,游览者拍了 33 张照片,幸运值分别是 5,7,115,7,11 ,那么最终保留在自己身上的幸运值就是 9(5 \ xor \ 7 \ xor \ 11)9(5 xor 7 xor 11) 。有些聪明的游览者发现,只要选择性地进行拍照,便能获得更大的幸运值。例如在上述三个幸运值中,只选择 55 和 1111 ,可以保留的幸运值为 1414 。

现在,一些游览者找到了聪明的你,希望你帮他们计算出在他们的行程安排中可以保留的最大幸运值是多少。

输入格式

第一行包含 22 个正整数 nn 、 qq ,分别表示城市的数量和旅行者数量。

第二行包含 nn 个非负整数,其中第 ii 个整数 G_iGi​ 表示 ii 号城市的幸运值。

随后

TeX parse error: Misplaced &

行,每行包含两个正整数 xx 、 yy ,表示 xx 号城市和 yy 号城市之间有一条道路相连。

随后 qq 行,每行包含两个正整数 xx 、 yy ,表示这名旅行者的旅行计划是从 xx 号城市到 yy 号城市。

输出格式

输出需要包含 qq 行,每行包含 11 个非负整数,表示这名旅行者可以保留的最大幸运值。

样例

样例输入

4 2
11 5 7 9
1 2
1 3
1 4
2 3
1 4

样例输出

14
11

数据范围与提示

【数据范围】

来源

SCOI2016 Day1

solution
看到求最大异或和,考虑用线性基解决。
我们开一个线性基的倍增数组。跳lca即可。
树剖+线段树可以支持修改。
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
#define maxn 20005
using namespace std;
int n,q,f[maxn][],deep[maxn],head[maxn],tot;
ll a[maxn];
struct node{
int v,nex;
}e[maxn*];
struct xx{
ll s[];
void ins(ll k){
for(int i=;i>=;i--){
if(k&(1LL<<i)){
if(!s[i]){s[i]=k;break;}
k^=s[i];
}
}
}
void c(){
memset(s,,sizeof s);
}
}g[maxn][];
void lj(int t1,int t2){
e[++tot].v=t2;e[tot].nex=head[t1];head[t1]=tot;
}
void dfs(int k,int fa){
f[k][]=fa;g[k][].ins(a[k]);deep[k]=deep[fa]+;
for(int i=head[k];i;i=e[i].nex){
if(e[i].v==fa)continue;
dfs(e[i].v,k);
}
}
xx merge(xx A,xx B){
for(int i=;i>=;i--){
if(B.s[i]>)A.ins(B.s[i]);
}
return A;
}
ll work(int t1,int t2){
xx ans;ans.c();
if(deep[t1]<deep[t2])swap(t1,t2);
for(int x=;x>=;x--){
if(deep[f[t1][x]]>=deep[t2])ans=merge(ans,g[t1][x]),t1=f[t1][x];
}
for(int x=;x>=;x--){
if(f[t1][x]!=f[t2][x]){
ans=merge(ans,g[t1][x]),t1=f[t1][x];
ans=merge(ans,g[t2][x]),t2=f[t2][x];
}
}
if(t1!=t2)ans=merge(ans,g[t1][]),ans=merge(ans,g[t2][]),t1=f[t1][];
ans=merge(ans,g[t1][]);
ll A=;
for(int i=;i>=;i--)A=max(A,A^ans.s[i]);
return A;
}
int main()
{
cin>>n>>q;
for(int i=;i<=n;i++)scanf("%lld",&a[i]);
for(int i=,t1,t2;i<n;i++){
scanf("%d%d",&t1,&t2);
lj(t1,t2);lj(t2,t1);
}
dfs(,);
for(int j=;j<=;j++)
for(int i=;i<=n;i++){
f[i][j]=f[f[i][j-]][j-];
g[i][j]=merge(g[i][j-],g[f[i][j-]][j-]);
}
for(int i=,t1,t2;i<=q;i++){
scanf("%d%d",&t1,&t2);
printf("%lld\n",work(t1,t2));
}
return ;
}

幸运数字(luckly)的更多相关文章

  1. BZOJ 1853 【Scoi2010】 幸运数字

    Description 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认 为,于是他定义自己的"幸运号码"是十进制表示中只包含数字6和8的那些号码,比如68,666,8 ...

  2. BZOJ 4568 幸运数字

    题目传送门 4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MB Description A 国共有 n 座城市,这些城市由 n-1 ...

  3. BZOJ 1853: [Scoi2010]幸运数字

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 2117  Solved: 779[Submit][Status] ...

  4. 【BZOJ-4568】幸运数字 树链剖分 + 线性基合并

    4568: [Scoi2016]幸运数字 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 238  Solved: 113[Submit][Status ...

  5. 【BZOJ-1853&2393】幸运数字&Cirno的完美算数教室 容斥原理 + 爆搜 + 剪枝

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 1817  Solved: 665[Submit][Status] ...

  6. BZOJ1853 [Scoi2010]幸运数字

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  7. 【bzoj1853】 Scoi2010—幸运数字

    http://www.lydsy.com/JudgeOnline/problem.php?id=1853 (题目链接) 今天考试考了容斥,结果空知道结论却不会写→_→ 题意 求区间中不含6,8两个数字 ...

  8. 幸运数字(number)

    幸运数字(number) Time Limit:1000ms   Memory Limit:64MB [题目描述] LYK最近运气很差,例如在NOIP初赛中仅仅考了90分,刚刚卡进复赛,于是它决定使用 ...

  9. Bzoj 1853: [Scoi2010]幸运数字 容斥原理,深搜

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 1774  Solved: 644[Submit][Status] ...

随机推荐

  1. SpringMVC-实现PUT请求上传文件(转)

    因为在图片上传的时候使用的是二进制的方式上传,所以使用隐藏域进行方法转换方式失效,转方法: https://www.cnblogs.com/morethink/p/6378015.html 可是后来我 ...

  2. PHP siege 压测 QPS大小

    1.使用 PHP-FPM SOCKET的形式通讯 2.配置 PHP-FPM配置 [root@bogon php-fpm.d]# ls -al 总用量 drwxr-xr-x. root root 8月 ...

  3. python的多继承C3(mro)算法

    多继承的继承顺序按照C3算法进行顺序继承 例一 按照深度A类从左往右有三条可继承的"路" 先按照深度优先的算法,将每一路的每一个节点加到列表中 B = [B,D,F,H] C = ...

  4. C++指针之间的赋值与转换规则总结

    C++指针之间的赋值与转换规则总结 Note:以下结论不适用于类的成员函数指针,关于类的成员函数指针会单独讨论. 一.任何类型的指针变量均可直接赋值给const void * 任何类型的非const指 ...

  5. 硬盘安装Windows Server 2008(解决系统盘符变成D盘)

    硬盘安装Windows 2008系统方法 操作系统最好用的无疑是server 2003,但是现在Server 2003支持的软件越来越少,很多是故意不支持Server 2003了, 像php5.5以上 ...

  6. C语言字符篇(二)字符串处理函数

    字符串处理函数 1. 拷贝 strcpy 2. 追加 strcat   #include <string.h>   char *strcpy(char *dest, const char ...

  7. PAT (Basic Level) Practice 1021 个位数统计

    个人练习 给定一个 k 位整数 N=d​k−1​​10​k−1​​+⋯+d​1​​10​1​​+d​0​​ (0≤d​i​​≤9, i=0,⋯,k−1, d​k−1​​>0),请编写程序统计每种 ...

  8. YCM的使用

    YCM大概用来做3件事: (1)自动补全 (2)检查语法 (3)跳转到函数定义 然后涉及到两个关键的文件.vimrc 和 .ycm_extra_conf.py 首先需要正确的配置,在.vimrc中写入 ...

  9. [BZOJ3714]Kuglarz(最小生成树)

    Description 魔术师的桌子上有n个杯子排成一行,编号为1,2,-,n,其中某些杯子底下藏有一个小球,如果你准确地猜出是哪些杯子,你就可以获得奖品.花费\(C_{i,j}\)元,魔术师就会告诉 ...

  10. Hadoop2.8.0 源码编译

    一.下载源码并解压 二.检查以下几项 必须有网络!!! JDK 1.7+ 安装方法 java -version Maven 3.0 or later 安装方法 mvn -version Findbug ...