\(\mathcal{Description}\)

  Link.

  给定 \(n\) 个点 \(m\) 条边的连通无向图 \(G\),边有边权。其中 \(u,v\) 的距离 \(d(u,v)\) 定义为 \(u\) 到 \(v\) 的最大异或路径。还有 \(q\) 次询问,每次给出 \(l,r\),求 \(\bigoplus_{l\le i<j\le r}d(i,j)\)。

  \(n,m,q\le10^5\),边权 \(w<2^{30}\)。

\(\mathcal{Solution}\)

  首先必然套用这个经典永流传的结论:设所有环的异或和构成空间 \(V\),\(d'(u,v)\) 为 \(u\) 到 \(v\) 的任意一条路径的异或和,则 \(d(u,v)=\max\{d'(u,v)\oplus x\mid x\in V\}\)。

  记变换 \(F_V:x\rightarrow \max\{x\oplus v\mid v\in V\}\),由于它不具有线性性,我们拆开 \(d(u,v)\) 的 \(\max\) 进行优化就显得困难。不过,考查与之类似的另一个变换 \(G_V:x\rightarrow\min\{x\oplus v\mid v\in V\}\),能够证明 \(G_V\) 是线性变换,且会得到一个炫酷的结论:\(F_V(x)=G_V(x)\oplus\max\{v\mid v\in V\}\)。

证明

  把 $x$ 等元素视为 $U=\{0,1\}^k$ 下的向量。设 $\boldsymbol x=\begin{pmatrix}x_0& x_1&\cdots& x_{k-1}\end{pmatrix}$,取 $U$ 的子空间 $V$ 的线性基 $\mathcal B$,令
$$
\mathcal B=\begin{pmatrix}\boldsymbol b_0\\ \boldsymbol b_1\\ \vdots \\ \boldsymbol b_{k-1}\end{pmatrix},
$$
其中 $\boldsymbol b_i=\begin{pmatrix} b_{i,0} & b_{i,1}&\cdots& b_{i,k-1} \end{pmatrix}$,且有 $\forall j\lt i,b_{i,j}=0$。此时考虑 $\boldsymbol x\mathcal B^T$ 的意义:若 $\boldsymbol x$ 某一分量为 $1$,则加上(即异或上)线性基中的对应向量,很显然就是在线性基中构造 $\min\{x\oplus v\mid v\in V\}$ 的方式,所以 $G_V$ 是一个线性变换。 $\square$

  “炫酷结论”就不证了,自证不难。

  回到题目,处理一下式子:

\[\begin{aligned}\bigoplus_{l\le i<j\le r}d(i,j) &= \bigoplus_{l\le i<j\le r}d'(i,j)\oplus G_V(d'(i,j))\oplus \max\{v\mid v\in V\}\\&= \left(\binom{r-l+1}{2}\otimes\max\{v\mid v\in V\}\right)\oplus G_V\left( \bigoplus_{l\le i<j\le r}d'(i,j) \right).\end{aligned}
\]

抵消掉大量重复异或之后直接计算即可。复杂度 \(\mathcal O(n+(m+q)\log w)\)。

\(\mathcal{Code}\)

/*~Rainybunny*/

#include <bits/stdc++.h>

#define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i ) const int MAXN = 1e5;
int n, m, q, ecnt, head[MAXN + 5], dis[MAXN + 5];
bool vis[MAXN + 5]; struct Edge { int to, val, nxt; } graph[MAXN * 2 + 5]; struct XorLinearBasic {
static const int W = 30;
int bas[W]; inline void insert( int v ) {
per ( i, W, 0 ) if ( v >> i & 1 ) {
if ( !bas[i] ) return void( bas[i] = v );
v ^= bas[i];
}
} inline int ask( int v, const bool tar ) {
per ( i, W, 0 ) if ( ( v >> i & 1 ) != tar ) v ^= bas[i];
return v;
}
} xlb; inline void link( const int u, const int v, const int w ) {
graph[++ecnt] = { v, w, head[u] }, head[u] = ecnt;
graph[++ecnt] = { u, w, head[v] }, head[v] = ecnt;
} inline void getCir( const int u ) {
vis[u] = true;
for ( int i = head[u], v; i; i = graph[i].nxt ) {
if ( vis[v = graph[i].to] ) {
xlb.insert( dis[u] ^ dis[v] ^ graph[i].val );
} else {
dis[v] = dis[u] ^ graph[i].val, getCir( v );
}
}
} int main() {
std::ios::sync_with_stdio( false ), std::cin.tie( 0 ); std::cin >> n >> m >> q;
rep ( i, 1, m ) {
int u, v, w; std::cin >> u >> v >> w;
link( u, v, w );
} getCir( 1 );
rep ( i, 1, n ) dis[i] ^= dis[i - 1]; for ( int l, r; q--; ) {
std::cin >> l >> r;
std::cout << xlb.ask( ( r - l ) & 1 ? dis[r] ^ dis[l - 1] : 0,
( r - l + 1ll ) * ( r - l ) >> 1 & 1 ) << '\n';
}
return 0;
}

Solution -「Gym 102956F」Find the XOR的更多相关文章

  1. Solution -「Gym 102956F」Border Similarity Undertaking

    \(\mathcal{Description}\)   Link.   给定一张 \(n\times m\) 的表格,每个格子上写有一个小写字母.求其中长宽至少为 \(2\),且边界格子上字母相同的矩 ...

  2. Solution -「Gym 102979E」Expected Distance

    \(\mathcal{Description}\)   Link.   用给定的 \(\{a_{n-1}\},\{c_n\}\) 生成一棵含有 \(n\) 个点的树,其中 \(u\) 连向 \([1, ...

  3. Solution -「Gym 102979L」 Lights On The Road

    \(\mathcal{Description}\)   Link.   给定序列 \(\{w_n\}\),选择 \(i\) 位置的代价为 \(w_i\),要求每个位置要不被选择,要不左右两个位置至少被 ...

  4. Solution -「Gym 102956B」Beautiful Sequence Unraveling

    \(\mathcal{Description}\)   Link.   求长度为 \(n\),值域为 \([1,m]\) 的整数序列 \(\lang a_n\rang\) 的个数,满足 \(\not\ ...

  5. Solution -「Gym 102956A」Belarusian State University

    \(\mathcal{Description}\)   Link.   给定两个不超过 \(2^n-1\) 次的多项式 \(A,B\),对于第 \(i\in[0,n)\) 个二进制位,定义任意一个二元 ...

  6. Solution -「Gym 102798I」Sean the Cuber

    \(\mathcal{Description}\)   Link.   给定两个可还原的二阶魔方,求从其中一个状态拧到另一个状态的最小步数.   数据组数 \(T\le2.5\times10^5\). ...

  7. Solution -「Gym 102798K」Tree Tweaking

    \(\mathcal{Description}\)   Link.   给定排列 \(\{p_n\}\),求任意重排 \(p_{l..r}\) 的元素后,将 \(\{p_n\}\) 依次插入二叉搜索树 ...

  8. Solution -「Gym 102798E」So Many Possibilities...

    \(\mathcal{Description}\)   Link.   给定非负整数序列 \(\{a_n\}\) 和 \(m\),每次随机在 \(\{a\}\) 中取一个非零的 \(a_i\)(保证存 ...

  9. Solution -「Gym 102759I」Query On A Tree 17

    \(\mathcal{Description}\)   Link.   给定一棵含 \(n\) 个结点的树,结点 \(1\) 为根,点 \(u\) 初始有点权 \(a_u=0\),维护 \(q\) 次 ...

随机推荐

  1. web.xml文件配置模板

    直接贴完整代码,当然,spring的核心控制器依赖包需要通过mean提前配置 <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.// ...

  2. springBoot--原理分析

    起步依赖分析 分析spring-boot-starter-parent 按住Ctrl点击pom.xml中的spring-boot-starter-parent,跳转到了spring-boot-star ...

  3. HTTP2和WebSocket

    HTTP http是目前应用最广泛的应用层协议,截止到目前为止已经发布了多个版本,最常用的是http1.1和http2. http0.9是最早的版本,功能很简单,没有header,只支持GET. ht ...

  4. 机器学习&恶意代码静态检测

    目录 分析工具 方法概述 二进制灰度图 字节(熵)直方图 字符串信息 ELF结构信息 源码分析与OPcode FCG references: 分析工具 readelf elfparser ninja ...

  5. python分支结构与循环结构

    python分支结构 一.if 单条件形式 # 年轻人的世界都不容易 age > 18 age = int(input("请输入您的年龄:")) # input()函数 模拟 ...

  6. 《剑指offer》面试题61. 扑克牌中的顺子

    问题描述 从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的.2-10为数字本身,A为1,J为11,Q为12,K为13,而大.小王为 0 ,可以看成任意数字.A 不能视为 14. 示例 ...

  7. Javascript中定时器的使用方法

    Javascript中定时器的使用方法 1.间隔定时器(每隔一段时间执行一次代码) 格式:setInterval(函数,时间) //时间单位是毫秒,每隔设置的时间执行函数里的内容一遍(一直执行) // ...

  8. 运行项目时出现Sat May 15 20:00:19 CST 2021 WARN: Establishing SSL connection without server‘s identity veri

    这时我们只需要在连接数据库的url上设置:useSSL=false就可以了.

  9. SpringBoot+Minio搭建不再爆肝秃头的分布式文件服务器

    前言 1).有人一定会问,为什么不用FastDFS?众所周知,FastDFS的原生安装非常复杂,有过安装经验的人大体都明白,虽然可以利用别人做好的docker直接安装,但真正使用过程中也可能出现许多莫 ...

  10. 中文分词,自然语言处理器NLP。 新版本已上线,增加二级行业分类。

    一  cacl2新版本上线,在一级行业的基础上深度挖掘,新增了对应的二级分类. 可以查看一级行业[农林牧渔],下面对应的所有二级行业的词库.这里拿[林业]来观察效果. 具体分词的效果. 二    Gi ...