luogu3292 [SCOI2016]幸运数字
题目大意:给一棵树,每个点有个权值,N<=2万
20万次询问,每次询问查询某两个点路径上所有点的权值xjb异或的最大值
首先看到xjb异或就可以断定是线性基了
并且由于这是树上问题我们可以通过树剖Dfs序之类的手段搞成序列问题
但是树剖+线段树的复杂度是 \(O(\log ^2N\log^2 2^{60})\) 的很明显会T
由于本题不需要修改,可以考虑维护一个倍增,bij代表点i向上跳2的j次方这段路上所有点权值的一个线性基
然后查询就是 \(O(\log N\log^2 2^{60})\) 的了,开O2勉强可过
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
int n, q;
long long init[20010];
vector<int> out[20010];
int fa[20010][16], depth[20010];
struct linear_basis
{
	long long sb[61];
	linear_basis() { memset(this, 0, sizeof(linear_basis)); }
	void insert(long long x)
	{
		for (int i = 60; i >= 0; i--) if (x & (1LL << i))
		{
			if (sb[i] == 0) { sb[i] = x; return; }
			else x ^= sb[i];
		}
	}
	long long query()
	{
		long long ans = 0;
		for (int i = 60; i >= 0; i--)
		{
			if ((ans ^ sb[i]) > ans) ans ^= sb[i];
		}
		return ans;
	}
} b[20010][16];
linear_basis operator+(const linear_basis &a, const linear_basis &b)
{
	linear_basis ans;
	for (int i = 60; i >= 0; i--) if (a.sb[i]) ans.insert(a.sb[i]);
	for (int i = 60; i >= 0; i--) if (b.sb[i]) ans.insert(b.sb[i]);
	return ans;
}
void dfs(int x) { for (int i : out[x]) if (fa[x][0] != i) fa[i][0] = x, depth[i] = depth[x] + 1, dfs(i); }
linear_basis qlca(int x, int y)
{
	if (depth[x] < depth[y]) swap(x, y);
	linear_basis ans;
	int sb = depth[x] - depth[y];
	for (int i = 15; i >= 0; i--) if (sb & (1 << i)) ans = ans + b[x][i], x = fa[x][i];
	if (x == y) { ans.insert(init[x]); return ans; }
	for (int i = 15; i >= 0; i--) if (fa[x][i] != fa[y][i]) ans = ans + b[x][i] + b[y][i], x = fa[x][i], y = fa[y][i];
	ans.insert(init[fa[x][0]]);
	ans.insert(init[x]);
	ans.insert(init[y]);
	return ans;
}
int main()
{
	scanf("%d%d", &n, &q);
	for (int i = 1; i <= n; i++) scanf("%lld", &init[i]);
	for (int x, y, i = 1; i < n; i++) scanf("%d%d", &x, &y), out[x].push_back(y), out[y].push_back(x);
	dfs(1);
	for (int i = 1; i <= n; i++) b[i][0].insert(init[i]);
	for (int j = 1; j <= 15; j++) for (int i = 1; i <= n; i++)
	{
		fa[i][j] = fa[fa[i][j - 1]][j - 1];
		b[i][j] = b[i][j - 1] + b[fa[i][j - 1]][j - 1];
	}
	for (int x, y, i = 1; i <= q; i++)
	{
		scanf("%d%d", &x, &y);
		linear_basis fuck = qlca(x, y);
		printf("%lld\n", fuck.query());
	}
	return 0;
}
另外观察到本题可以离线,于是我们可以考虑淀粉质?
淀粉质,每次淀粉质维护当前树上每个点到当前的根的线性基(每次只需要往他父亲的线性基里插入一个数然后粘过来,复杂度是log的),然后查询只需要合并两个线性基,复杂度比在线lca少一个log N。
不太好写所以没写
luogu3292 [SCOI2016]幸运数字的更多相关文章
- BZOJ 4568: [Scoi2016]幸运数字 [线性基 倍增]
		4568: [Scoi2016]幸运数字 题意:一颗带点权的树,求树上两点间异或值最大子集的异或值 显然要用线性基 可以用倍增的思想,维护每个点向上\(2^j\)个祖先这些点的线性基,求lca的时候合 ... 
- [SCOI2016]幸运数字 树链剖分,线性基
		[SCOI2016]幸运数字 LG传送门 为了快乐,我们用树剖写这题. 强行树剖,线段树上每个结点维护一个线性基,每次查询暴力合并. 瞎分析一波复杂度:树剖两点之间\(\log n\)条重链,每条重链 ... 
- bzoj 4568: [Scoi2016]幸运数字
		4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 848 Solved: 336[Submit][Status ... 
- [洛谷P3292] [SCOI2016]幸运数字
		洛谷题目链接:[SCOI2016]幸运数字 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城 ... 
- 【BZOJ 4568】 4568: [Scoi2016]幸运数字 (线性基+树链剖分+线段树)
		4568: [Scoi2016]幸运数字 Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个 幸运数字,以纪念碑的形 ... 
- [BZOJ4568][Scoi2016]幸运数字  倍增+线性基
		4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 1791 Solved: 685[Submit][Statu ... 
- [BZOJ4568][SCOI2016]幸运数字(倍增LCA,点分治+线性基)
		4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 2131 Solved: 865[Submit][Statu ... 
- 【BZOJ4568】[Scoi2016]幸运数字 倍增+线性基
		[BZOJ4568][Scoi2016]幸运数字 Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念 ... 
- bzoj4568: [Scoi2016]幸运数字(LCA+线性基)
		4568: [Scoi2016]幸运数字 题目:传送门 题解: 好题!!! 之前就看过,当时说是要用线性基...就没学 填坑填坑: %%%线性基 && 神犇 主要还是对于线性基的运用和 ... 
随机推荐
- 49. Group Anagrams同义词合并
			[抄题]: Given an array of strings, group anagrams together. Example: Input: ["eat", "te ... 
- spring4-5-事务管理
			1.简单介绍 事务管理是企业级应用程序开发中必不可少的技术, 用来确保数据的完整性和一致性. 事务就是一系列的动作, 它们被当做一个单独的工作单元. 这些动作要么全部完成, 要么全部不起作用 事务的 ... 
- 查看并解除Oracle锁
			当某个数据库用户在数据库中插入.更新.删除一个表的数据,或者增加一个表的主键时或者表的索引时, 常常会出现ora-00054:resource busy and acquire with nowait ... 
- Hadoop权威指南文摘
			第1章 初识Hadoop 1.1 数据!数据! 1.2 数据的存储与分析 HDFS实现数据的存储,MapReduce实现数据额分析与处理 1.3 相较于其他系统的优势 MapReduce是一个批量查询 ... 
- 数据库工具链接阿里云MySQL数据库
			数据库工具:Toad for MySQL ssh工具:XShell 5 跳板机配置: 配置通道: 源主机:数据库工具链接的地址: 侦听接口:数据库工具侦听接口: 目标主机:数据库阿里云地址: 目标端口 ... 
- C# SendKeys用法
			功能:将一个或多个按键消息发送到活动窗口,就如同在键盘上进行输入一样. 语法:SendKeys.Send(string keys);SendKeys.SendWait(string keys); 说明 ... 
- 云存储上传控件更新日志-Xproer.cloud2
			官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webapp/cloud2/index.asp 在线演示:http://www.ncmem.c ... 
- Ubuntu解压缩zip,tar,tar.gz,tar.bz2【转】
			ZIP zip可能是目前使用得最多的文档压缩格式.它最大的优点就是在不同的操作系统平台,比如Linux, Windows以及Mac OS,上使用.缺点就是支持的压缩率不是很高,而tar.gz和tar. ... 
- Android 热修复技术中的CLASS_ISPREVERIFIED问题
			一.前言 上一篇博客中,我们通过介绍dex分包原理引出了Android的热补丁技术,而现在我们将解决两个问题. 1. 怎么将修复后的Bug类打包成dex 2. 怎么将外部的dex插入到ClassLoa ... 
- Android-自动完成提示框CompletionTextView
			自动完成提示框CompletionTextView可以实现以下效果(提示框从那里出来是系统自动处理的): 类似于在百度输入框,输入一个字符,会自动提示很多和这个相关的条目内容 定义自动完成提示框(此控 ... 
