【线性基合并 树链剖分】bzoj4568: [Scoi2016]幸运数字
板子题
Description
Input
Output
输出需要包含 q 行,每行包含 1 个非负整数,表示这名旅行者可以保留的最大幸运值。
题目分析
树剖/倍增的板子题
想用树剖来做一做,然而TLE了好几发。
发现自己常数意识太差,每次query时候都开一个线性基,活生生浪费10s+
#include<bits/stdc++.h>
#define ENS //__attribute__((optimize("-O2")))
#define NES //__attribute__((optimize("-O2"))) //__inline__ __attribute__((always_inline))
typedef long long ll;
const int maxn = ;
const int maxm = ;
const int maxq = ; struct Linear
{
ll p[];
Linear(){memset(p, , sizeof p);}
NES void insert(ll c)
{
for (int i=, chk=; i>=&&!chk; i--)
if (c>>i){
if (p[i]) c ^= p[i];
else p[i] = c, chk = ;
}
}
NES void merge(Linear b)
{
for (int i=; i>=; i--)
if (b.p[i]) insert(b.p[i]);
}
NES ll max()
{
ll ret = ;
for (int i=; i>=; i--)
if ((ret^p[i]) > ret) ret ^= p[i];
return ret;
}
}f[maxn<<];
struct node
{
int fa,son,top,tot;
}a[maxn];
int n,q,chain[maxn],chTot,dep[maxn];
int edgeTot,head[maxn],nxt[maxm],edges[maxm];
ll g[maxn],cnVal[maxn]; template <typename T> NES void read(T&x)
{
char cu=getchar();x=;bool fla=;
while(!isdigit(cu)){if(cu=='-')fla=;cu=getchar();}
while(isdigit(cu))x=x*+cu-'',cu=getchar();
if(fla)x=-x;
}
void write(ll x){if (x/) write(x/);putchar(''+x%);}
void writeln(ll x){write(x), putchar('\n');}
NES void addedge()
{
int u,v;
read(u), read(v);
edges[++edgeTot] = v, nxt[edgeTot] = head[u], head[u] = edgeTot;
edges[++edgeTot] = u, nxt[edgeTot] = head[v], head[v] = edgeTot;
}
void dfs1(int x, int fa)
{
a[x].son = a[x].top = -, a[x].fa = fa;
a[x].tot = , dep[x] = dep[fa]+;
for (int i=head[x]; i!=-; i=nxt[i])
{
int v = edges[i];
if (v!=fa){
dfs1(v, x), a[x].tot += a[v].tot;
if (a[x].son==-||a[a[x].son].tot < a[v].tot) a[x].son = v;
}
}
}
void dfs2(int x, int top)
{
a[x].top = top, chain[x] = ++chTot, cnVal[chTot] = g[x];
if (a[x].son==-) return;
dfs2(a[x].son, top);
for (int i=head[x]; i!=-; i=nxt[i])
{
int v = edges[i];
if (v!=a[x].son&&v!=a[x].fa) dfs2(v, v);
}
}
void build(int rt, int l, int r)
{
if (l==r){
f[rt].insert(cnVal[l]);
return;
}
int mid = (l+r)>>;
build(rt<<, l, mid);
build(rt<<|, mid+, r);
f[rt] = f[rt<<], f[rt].merge(f[rt<<|]);
}
Linear query(int rt, int l, int r, int L, int R)
{
if (L <= l&&r <= R) return f[rt];
int mid = (l+r)>>;
if (L <= mid&&R > mid){ Linear tmp = query(rt<<, l, mid, L, R);
tmp.merge(query(rt<<|, mid+, r, L, R));
return tmp;
}else if (L <= mid) return query(rt<<, l, mid, L, R);
else if (R > mid) return query(rt<<|, mid+, r, L, R);
}
NES void queryChain()
{
Linear ret;
int x,y;
read(x), read(y);
while (a[x].top!=a[y].top)
{
if (dep[a[x].top] > dep[a[y].top]) std::swap(x, y);
ret.merge(query(, , n, chain[a[y].top], chain[y]));
y = a[a[y].top].fa;
}
if (dep[x] > dep[y]) std::swap(x, y);
ret.merge(query(, , n, chain[x], chain[y]));
writeln(ret.max());
}
ENS int main()
{
memset(head, -, sizeof head);
read(n), read(q);
for (int i=; i<=n; i++) read(g[i]);
for (int i=; i<n; i++) addedge();
dfs1(, ), dfs2(, );
build(, , n);
while (q--) queryChain();
return ;
}
END
【线性基合并 树链剖分】bzoj4568: [Scoi2016]幸运数字的更多相关文章
- 【BZOJ4568】幸运数字(线性基,树链剖分,ST表)
[BZOJ4568]幸运数字(线性基,树链剖分,ST表) 题面 BZOJ Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市 ...
- bzoj4568 [Scoi2016]幸运数字 线性基+树链剖分
A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个 幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征.一些旅行者希望游览 A ...
- [BZOJ4568][SCOI2016]幸运数字(倍增LCA,点分治+线性基)
4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 2131 Solved: 865[Submit][Statu ...
- BZOJ4568 [Scoi2016]幸运数字 【点分治 + 线性基】
题目链接 BZOJ4568 题解 选任意个数异或和最大,使用线性基 线性基插入\(O(logn)\),合并\(O(log^2n)\) 我们要求树上两点间异或和最大值,由于合并是\(O(log^2n)\ ...
- bzoj4568: [Scoi2016]幸运数字(LCA+线性基)
4568: [Scoi2016]幸运数字 题目:传送门 题解: 好题!!! 之前就看过,当时说是要用线性基...就没学 填坑填坑: %%%线性基 && 神犇 主要还是对于线性基的运用和 ...
- luogu P6088 [JSOI2015]字符串树 可持久化trie 线段树合并 树链剖分 trie树
LINK:字符串树 先说比较简单的正解.由于我没有从最简单的考虑答案的角度思考 所以... 下次还需要把所有角度都考察到. 求x~y的答案 考虑 求x~根+y~根-2*lca~根的答案. 那么问题变成 ...
- bzoj 2243: [SDOI2011]染色 线段树区间合并+树链剖分
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 7925 Solved: 2975[Submit][Status ...
- [BZOJ4568][Scoi2016]幸运数字 倍增+线性基
4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 1791 Solved: 685[Submit][Statu ...
- 2019.03.25 bzoj4568: [Scoi2016]幸运数字(倍增+线性基)
传送门 题意:给你一棵带点权的树,多次询问路径的最大异或和. 思路: 线性基上树?? 倍增维护一下就完了. 时间复杂度O(nlog3n)O(nlog^3n)O(nlog3n) 代码: #include ...
随机推荐
- 乐字节-Java8核心特性实战之Stream(流)
说起流,我们会想起手机 ,电脑组装流水线,物流仓库商品包装流水线等等.如果把手机 ,电脑,包裹看做最终结果的话,那么加工商品前的各种零部件就可以看做数据源,而中间一系列的加工作业操作,就可以看做流的处 ...
- SonarQube总结
官网:https://www.sonarqube.org/ 一款代码质量管理开源平台.
- Educational Codeforces Round 65 (Rated for Div. 2) C. News Distribution
链接:https://codeforces.com/contest/1167/problem/C 题意: In some social network, there are nn users comm ...
- Codeforces Round #432 (Div. 2, based on IndiaHacks Final Round 2017) D
Arpa has found a list containing n numbers. He calls a list bad if and only if it is not empty and g ...
- B. Batch Sort
http://codeforces.com/contest/724/problem/B 被坑了,一开始以为如果有一行已经是排好序了,然后有一行需要转换的次数 >= 2的话,那就直接no了. 因为 ...
- VS2010/OpenGL配置
1.下载glut:http://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip 2.把解压得到的glut.h放到"C:\ ...
- ABAP数据类型
数据类型表: 类型缩写 类型 默认长度 允许长度 初始值 描述 C 文本型 1 Space 字符串数据,如'Program' D 日期型 8 8 '00000000' 日期数据,格式为YYYYMM ...
- HBase数据模型(1)
HBase数据模型(1) HBase数据模型(2) 1.0 HBase的特性 Table HBase以表(Table)的方式组织数据,数据存储在表中. Row/Column 行(Row)和列(Colu ...
- Android笔记--LayoutInflator源码和使用分析
LayoutInflator源码分析 获取LayoutInflator对象 获取LayoutInflator的方式有两种: 使用LayoutInflator.from(Context context) ...
- socket tcp使用recv接收数据时,返回errno错误代码88
原因:就是recv函数的第一个参数不是可用的,也就是第一个参数不是建立连接时返回的文件描述符. 解决方法:xxx