Loading

题解 [NFLS 2023.10.19] God 的数学课

题意

给定 \(n\) 个模 \(10^9+7\) 意义下的 \(k\) 元一次方程 \(A_i:a_{i,1}x_1+a_{i,2}x_2+\dots+a_{i,k}x_k=a_{i,k+1}\),每个方程有一个价值 \(b_i\)。有 \(q\) 次询问,每次给定区间 \([l,r]\),问最大的 \(\sum_{i=L}^R b_i\) 使得 \([L,R]\subseteq [l,r]\)\(A_L,A_{L+1},\dots,A_R\) 这些方程能确定唯一的一组解。

\(n\le 10^5,k\le 30,q\le 3\times 10^5\)\(b_i\) 可能是负的,时限 2.5s。

题解

考虑若干个线性方程组不能确定唯一解的情况,一种是线性方程组不满秩,一种是某一个方程能被其他方程表出且矛盾。

枚举 \(R\),需要维护的是一段区间 \([L_1,L_2]\) 表示在这段区间内的 \(L\) 组成的 \([L,R]\) 是合法的。显然 \(L_1,L_2\) 都是单调不降的,于是只需要维护 \([L_1,R]\) 中的方程的可删除线性基。

可删除线性基只需要在普通线性基的基础上,对每个基底记录它的插入时间 \(t_i\)。当新插入一个时间为 \(T\) 的方程 \(X\) 时,枚举线性基中的每一位,如果 \(t_i<T\) 则交换线性基上这一位的方程与 \(X\)。消元的过程与普通线性基相同。

于是我们得到了若干组区间,每一组固定了右端点,而左端点在某个区间内,每次询问的是权值和最大的子区间。

用线段树维护。令 \(s\)\(b\) 的前缀和数组,开始时线段树上位置 \(i\) 的值是 \(-s_{i-1}\)\(R\) 每增加 \(1\),就全局加 \(b_R\)。对于右端点在 \(R\) 的区间 \([L_1,L_2]\),在线段树上对这个区间 push 一个历史最大值标记。

时间复杂度 \(O(nk(k+\log P)+(n+q)\log n)\)

posted @ 2023-10-31 23:00  Alan_Zhao_2007  阅读(0)  评论(0)    收藏  举报