博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 4568: [Scoi2016]幸运数字(树上倍增+线性基)
阅读量:2143 次
发布时间:2019-04-30

本文共 1991 字,大约阅读时间需要 6 分钟。

Time Limit: 60 Sec  
Memory Limit: 256 MB
Submit: 1692  
Solved: 643
[ ][ ][ ]

Description

A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一。每座城市都有一个
幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征。一些旅行者希望游览 A 国。旅行者计划乘飞机降落在 x 号城市,沿着 x 号城市到 y 号城市之间那条唯一的路径游览,最终从 y 城市起飞离开 A 国。
在经过每一座城市时,游览者就会有机会与这座城市的幸运数字拍照,从而将这份幸运保存到自己身上。然而,幸运是不能简单叠加的,这一点游览者也十分清楚。他们迷信着幸运数字是以异或的方式保留在自己身上的。例如,游览者拍了 3 张照片,幸运值分别是 5,7,11,那么最终保留在自己身上的幸运值就是 9(5 xor 7 xor 11)。
有些聪明的游览者发现,只要选择性地进行拍照,便能获得更大的幸运值。例如在上述三个幸运值中,只选择 5 
和 11 ,可以保留的幸运值为 14 。现在,一些游览者找到了聪明的你,希望你帮他们计算出在他们的行程安排中可以保留的最大幸运值是多少。

Input

第一行包含 2 个正整数 n ,q,分别表示城市的数量和旅行者数量。第二行包含 n 个非负整数,其中第 i 个整
数 Gi 表示 i 号城市的幸运值。随后 n-1 行,每行包含两个正整数 x ,y,表示 x 号城市和 y 号城市之间有一
条道路相连。随后 q 行,每行包含两个正整数 x ,y,表示这名旅行者的旅行计划是从 x 号城市到 y 号城市。N
<=20000,Q<=200000,Gi<=2^60

Output

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

Sample Input

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

Sample Output

14
11

题目太长,其实意思就是一棵树,每个节点都有一个权值,n次查询,每次查询u到v路程上所有节点的异或最大值

思路:

查询模板用倍增LCA

处理异或最大值用线性基+贪心

两个模板合并一下就行了

复杂度O(64qlogn+64²n)比较高

#include
#include
#include
using namespace std;#define LL long longvector
G[20005];LL val[20005], p[20005][18][66];int deep[20005], fa[20005][18];void Merge(LL *jz, LL *a, LL *b){ int i, j; LL temp[66]; for(i=62;i>=0;i--) { jz[i] = a[i]; temp[i] = b[i]; } for(i=62;i>=0;i--) { if(temp[i]==0) continue; for(j=i;j>=0;j--) { if(temp[i]&(1ll<
=0;i--) { if((ans^jz[i])>ans) ans ^= jz[i]; } return ans;}LL Query(int x, int y){ int i; LL jz[66]; memset(jz, 0, sizeof(jz)); if(deep[x]
=1;i--) { if(deep[fa[x][i]]>=deep[y]) { Merge(jz, jz, p[x][i]); x = fa[x][i]; } } if(x==y) return Jud(jz); for(i=16;i>=1;i--) { if(fa[x][i]!=fa[y][i]) { Merge(jz, jz, p[x][i]); Merge(jz, jz, p[y][i]); x = fa[x][i]; y = fa[y][i]; } } Merge(jz, jz, p[x][1]); Merge(jz, jz, p[y][1]); return Jud(jz);}int main(void){ int x, y, n, q, i, j; scanf("%d%d", &n, &q); for(i=1;i<=n;i++) { scanf("%lld", &val[i]); fa[i][0] = i; for(j=62;j>=0;j--) { if(val[i]&(1ll<

转载地址:http://pmmgf.baihongyu.com/

你可能感兴趣的文章
win10将IE11兼容ie10
查看>>
checkbox设置字体颜色
查看>>
第一篇 HelloWorld.java重新学起
查看>>
ORACLE表空间扩张
查看>>
orcal 循环执行sql
查看>>
web.xml配置监听器,加载数据库信息配置文件ServletContextListener
查看>>
结构型模式之桥接模式(Bridge)
查看>>
行为型模式之状态模式(State)
查看>>
行为型模式之策略模式(Strategy)
查看>>
行为型模式之模板方法模式(TemplateMethod)
查看>>
行为型模式之访问者模式(Visitor)
查看>>
大小端详解
查看>>
source insight使用方法简介
查看>>
<stdarg.h>头文件的使用
查看>>
C++/C 宏定义(define)中# ## 的含义 宏拼接
查看>>
Git安装配置
查看>>
linux中fork()函数详解
查看>>
C语言字符、字符串操作偏僻函数总结
查看>>
Git的Patch功能
查看>>
分析C语言的声明
查看>>