考虑点分治,将询问离线后计算重心到每一个点的线性基,然后再询问重心到每一个点的线性基,时间复杂度为$o(3600q)$,可以过(然而太菜的我写了倍增维护线性基,震惊于倍增和线性基常数之小)

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 20005
4 #define oo 0x3f3f3f3f
5 #define ll long long
6 struct ji{
7 ll a[61];
8 }o,dp[N][21];
9 struct ji2{
10 int nex,to;
11 }edge[N<<1];
12 int E,n,m,x,y,head[N],in[N],out[N],f[N][21];
13 ll a[N];
14 bool pd(int x,int y){
15 return (in[x]<=in[y])&&(out[y]<=out[x]);
16 }
17 void add(int x,int y){
18 edge[E].nex=head[x];
19 edge[E].to=y;
20 head[x]=E++;
21 }
22 void add(ji &x,ll y){
23 for(int i=60;i>=0;i--)
24 if (y&(1LL<<i))
25 if (x.a[i])y^=x.a[i];
26 else{
27 x.a[i]=y;
28 break;
29 }
30 }
31 void merge(ji &x,ji y){
32 for(int i=0;i<=60;i++)
33 if (y.a[i])add(x,y.a[i]);
34 }
35 void dfs(int k,int fa){
36 in[k]=++x;
37 f[k][0]=fa;
38 add(dp[k][0],a[k]);
39 for(int i=1;i<=20;i++){
40 f[k][i]=f[f[k][i-1]][i-1];
41 dp[k][i]=dp[k][i-1];
42 merge(dp[k][i],dp[f[k][i-1]][i-1]);
43 }
44 for(int i=head[k];i!=-1;i=edge[i].nex)
45 if (edge[i].to!=fa)dfs(edge[i].to,k);
46 out[k]=++x;
47 }
48 ji calc(int x,int y){
49 if (x==y)return dp[x][0];
50 ji z;
51 memset(z.a,0,sizeof(z.a));
52 for(int i=20;i>=0;i--)
53 if (!pd(f[x][i],y)){
54 merge(z,dp[x][i]);
55 x=f[x][i];
56 }
57 for(int i=20;i>=0;i--)
58 if (!pd(f[y][i],x)){
59 merge(z,dp[y][i]);
60 y=f[y][i];
61 }
62 merge(z,dp[x][pd(x,y)^1]);
63 if (!pd(y,x))merge(z,dp[y][0]);
64 return z;
65 }
66 ll query(ji o){
67 ll ans=0;
68 for(int j=60;j>=0;j--)
69 if ((ans&(1LL<<j))==0)ans^=o.a[j];
70 return ans;
71 }
72 int main(){
73 scanf("%d%d",&n,&m);
74 memset(head,-1,sizeof(head));
75 for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
76 for(int i=1;i<n;i++){
77 scanf("%d%d",&x,&y);
78 add(x,y);
79 add(y,x);
80 }
81 dfs(1,1);
82 for(int i=1;i<=m;i++){
83 scanf("%d%d",&x,&y);
84 printf("%lld\n",query(calc(x,y)));
85 }
86 }

[luogu3292]幸运数字的更多相关文章

  1. luogu3292 幸运数字 (点分治+线性基)

    首先第一眼是一个倍增套线性基,但是$O(Qlog^2Vlog^N)=10^{10}$的复杂度... 即使是st表也只是变成了$O(Nlog^2Vlog^N)$啊 考虑点分治,相对于倍增显著减少了线性基 ...

  2. BZOJ 1853 【Scoi2010】 幸运数字

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

  3. BZOJ 4568 幸运数字

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

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

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

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

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

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

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

  7. BZOJ1853 [Scoi2010]幸运数字

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

  8. 【bzoj1853】 Scoi2010—幸运数字

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

  9. 幸运数字(number)

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

随机推荐

  1. 算法——快速排序迭代式和递归式的Java实现

    快速排序迭代式和递归式的Java实现 快速排序基于分治法的思想,在待排序表中任选一值作为中枢值 pivot,一趟快排将所有大于该值的元素置于一边,小于该值的元素置于另一边,这样一个元素在排序中的最终位 ...

  2. C++ IDE或编辑器安装

    IDE介绍 上节课我们讲了C++编译器,可是没有好的编辑器,只用记事本打代码,这谁受得了.Linux vim至少还有代码高亮(即我作文里经常会出现的"彩色的代码"),记事本连高亮都 ...

  3. Kubernetes List-Watch 机制原理与实现 - chunked

    概述http chunkedwatch api 概述 Kubernetes 中主要通过 List-Watch 机制实现组件间的异步消息通信,List-Watch 机制的实现原理值得深入分析下 . 在 ...

  4. 【数据结构与算法Python版学习笔记】基本数据结构——列表 List,链表实现

    无序表链表 定义 一种数据项按照相对位置存放的数据集 抽象数据类型无序列表 UnorderedList 方法 list() 创建一个新的空列表.它不需要参数,而返回一个空列表. add(item) 将 ...

  5. nssm.exe使用方法

    nssm no-sucking service manager 1. 安装服务命令 nssm install <servicename> nssm install <servicen ...

  6. JVM:内存结构

    JVM:内存结构 说明:这是看了 bilibili 上 黑马程序员 的课程 JVM完整教程 后做的笔记 内容 程序计数器 虚拟机栈 本地方法栈 堆 方法区 直接内存 1. 程序计数器 1.1 定义 P ...

  7. [CSP-S 2021] 回文

    题目描述: 给定正整数 n 和整数序列 a1, a2,-,a2n,在这 2n 个数中,1, 2,-,n 分别各出现恰好 2 次.现在进行 2n 次操作,目标是创建一个长度同样为 2n 的序列 b 1, ...

  8. QEvent

    QEvent类是所有事件类的基类,每一个对象都包含事件参数.Qt的主事件循环(QCoreApplication::exec())从事件队列中接收本地窗口系统的事件,并将它们翻译成QEvent,将这些事 ...

  9. 零基础入门该如何实现C 语言面向对象编程(很有帮助)

    零基础如果更快更好的入门C语言,如何在枯燥的学习中找到属于自己的兴趣,如果把学习当成一种事务性的那以后的学习将会很难有更深入的进步,如果带着乐趣来完成学习那将越学越有意思这样才会让你有想要更深入学习的 ...

  10. Python课程笔记(八)

    一些简单的文件操作,学过linux的话理解感觉不会很难.课程代码 一.OS 目录方法 这个模块提供了一种方便的使用操作系统函数的方法 函数 说明 os.mkdir("path") ...