当前没有测试数据。
A
QOJ8593 难度 2
首先,我们在最终的图中找到一个拓扑序,然后对这个排列做一下置换。下面我们钦定每次给出的 x , y x,y x , y 都满足 x < y x<y x < y ;一个数 x x x 当前能被确定,当且仅当它能到达 x − 1 x-1 x − 1 个点,且有 n − x n-x n − x 个点能到达它。
我们考虑 x − 1 x-1 x − 1 ,发现他必须得能从 x x x 直接到达;进一步考虑 x − 2 x-2 x − 2 ,发现它的入边里面至少得有 x − 1 x-1 x − 1 或 x x x 。
依此类推,我们可以发现,如果设 a i a_i a i 表示 i i i 的入边中编号最小的点,那么 x x x 能到达 1 , 2 , ⋯ , x − 1 1,2,\cdots,x-1 1 , 2 , ⋯ , x − 1 ,当且仅当对所有的 i = 1 , 2 , ⋯ , x − 1 i=1,2,\cdots,x-1 i = 1 , 2 , ⋯ , x − 1 ,都有 a i ≤ x a_i\le x a i ≤ x 。同理设 b i b_i b i 表示 i i i 的出边中编号最大的点,那么还需要对所有的 i > x i>x i > x ,都有 b i ≥ x b_i\ge x b i ≥ x 。
每次修改对 a , b a,b a , b 的影响是 O ( 1 ) O(1) O ( 1 ) 的,简单用线段树维护下就行。时间复杂度 O ( ( n + m ) log n ) O((n+m)\log n) O (( n + m ) log n ) 。
B
LOJ3687 难度 2
首先,当 i < j i<j i < j 时,T i ≤ T j T_i\le T_j T i ≤ T j 等价于 s [ i + 1 , j ] ≤ s [ i , j − 1 ] s[i+1,j]\le s[i,j-1] s [ i + 1 , j ] ≤ s [ i , j − 1 ] 。
也就是说,区间 [ i , j − 1 ] [i,j-1] [ i , j − 1 ] 内第一个满足 s k ≠ s k + 1 s_k\neq s_{k+1} s k = s k + 1 的位置 k k k 需要满足 s k ≥ s k + 1 s_k\ge s_{k+1} s k ≥ s k + 1 。
另一方面,如果 i > j i>j i > j ,那么相当于区间 [ j , i − 1 ] [j,i-1] [ j , i − 1 ] 内第一个满足 s k ≠ s k + 1 s_k\neq s_{k+1} s k = s k + 1 的位置 k k k 满足 s k ≤ s k + 1 s_k\le s_{k+1} s k ≤ s k + 1 。
称 i < j i<j i < j 的限制 T i ≤ T j T_i\le T_j T i ≤ T j 为第一类约束区间 [ i , j − 1 ] [i,j-1] [ i , j − 1 ] ,否则为第二类约束区间 [ j , i − 1 ] [j,i-1] [ j , i − 1 ] 。
直接记录 f ( i , j ) f(i,j) f ( i , j ) 表示前 i i i 个字符,s i = j s_i=j s i = j 的方案数。转移时,我们分三种情况讨论:
s i = s i + 1 s_i=s_{i+1} s i = s i + 1 :此时没有约束,直接转移 f ( i , j ) → f ( i + 1 , j ) f(i,j)\to f(i+1,j) f ( i , j ) → f ( i + 1 , j ) 。
s i > s i + 1 s_i>s_{i+1} s i > s i + 1 :枚举上一个 s k ≠ s k + 1 s_k\neq s_{k+1} s k = s k + 1 的位置 k k k ,那么要求 i i i 能满足所有 l > k , r ≥ i l>k,r\ge i l > k , r ≥ i 的 [ l , r ] [l,r] [ l , r ] 的约束,也就是不能存在第二类约束区间,满足 k < l ≤ i , r ≥ i k<l\le i,r\ge i k < l ≤ i , r ≥ i 。合法的 k k k 是一段后缀,可以拿 set 简单维护得到这段后缀。得到合法后缀之后有 f ( k + 1 , j ) − f ( k , j ) → f ( i + 1 , [ x < j ] ) f(k+1,j)-f(k,j)\to f(i+1,[x<j]) f ( k + 1 , j ) − f ( k , j ) → f ( i + 1 , [ x < j ]) ,可以简单做到 O ( 1 ) O(1) O ( 1 ) 转移。
s i < s i + 1 s_i<s_{i+1} s i < s i + 1 :类似。
综上,总复杂度 O ( n ∣ Σ ∣ + n log n ) O(n|\Sigma|+n\log n) O ( n ∣Σ∣ + n log n ) ,其中 ∣ Σ ∣ = 26 |\Sigma|=26 ∣Σ∣ = 26 。
C
ARC148E 难度 3
考虑把数分成 ≥ K 2 \ge\frac{K}{2} ≥ 2 K 和 < K 2 <\frac{K}{2} < 2 K 的,那么 < K 2 <\frac{K}{2} < 2 K 的一定不能相邻,≥ K 2 \ge\frac{K}{2} ≥ 2 K 的一定可以相邻,而如果分别再两边,那么 x , y x,y x , y (x < K 2 ≤ y x<\frac{K}{2}\le y x < 2 K ≤ y ) 可以相邻当且仅当 x + y ≥ K ⟺ K 2 − x ≤ y − K 2 x+y\ge K\iff \frac{K}{2}-x\le y-\frac{K}{2} x + y ≥ K ⟺ 2 K − x ≤ y − 2 K 。
于是我们按照 ∣ x − K 2 ∣ |x-\frac{K}{2}| ∣ x − 2 K ∣ 从大到小的顺序插入每种数(如果有 x + y = K x+y=K x + y = K 那么我们先插入大的)然后把方案数乘起来即可。具体来说我们分类讨论一下插入的这个数 x x x 是 ≥ K 2 \ge \frac{K}{2} ≥ 2 K 还是 < K 2 <\frac{K}{2} < 2 K ,设其个数为 y y y ,维护满足当前两边都是 ≥ K 2 \ge \frac{K}{2} ≥ 2 K 的数这样的空隙个数 s s s ,那么
如果 x ≥ K 2 x\ge \frac{K}{2} x ≥ 2 K ,那么 x x x 只能和 ≥ K 2 \ge\frac{K}{2} ≥ 2 K 的数相邻。不难发现不管怎么插入,空隙的个数一定只会增加 y y y 。于是方案数是 ( s + y − 1 y ) \binom{s+y-1}{y} ( y s + y − 1 ) ,然后我们令 s ← s + y s\leftarrow s+y s ← s + y 。
如果 x < K 2 x<\frac{K}{2} x < 2 K ,那么 x x x 可以放在任意一个空隙里面,不难得到方案数为 ( s y ) \binom{s}{y} ( y s ) ,然后插入一个肯定会减少一个空隙,所以需要把 s ← s − y s\leftarrow s-y s ← s − y 。
总复杂度 O ( n log n ) O(n\log n) O ( n log n ) ,瓶颈在排序。
D
LOJ2472 难度 3
考虑依次给 i = 1 , 2 , ⋯ , n i=1,2,\cdots,n i = 1 , 2 , ⋯ , n 填上数,每次尽量填最大的。考虑什么时候 i i i 填上 x x x 是合法的。考虑 Hall 定理,发现左部点约束最严的时候肯定是找一个已经填过的点 u u u ,然后对所有 d v ≥ d u d_v\ge d_u d v ≥ d u 的 v v v ,选出 v v v 的子树内的所有点,也就是说我们会选一个后缀的子树的并。形式化地,对每个已经填过的点 u u u ,所有 d v ≥ d u d_v\ge d_u d v ≥ d u 的 v v v 的子树内未填的点并起来的大小不能超过 ≥ d u \ge d_u ≥ d u 且尚未被填入的格子个数。
维护 w i w_i w i 表示如果在判定中选择分界点为 i i i ,≥ i \ge i ≥ i 的剩余空位数减去所有 d u ≥ i d_u\ge i d u ≥ i 的子树并中未填点数的差,那么当前状态合法当且仅当 w i ≥ 0 w_i\ge 0 w i ≥ 0 对所有 i i i 成立。
考虑给 u u u 填入 x x x 有什么影响,发现对前一项的影响是所有 i ≤ x i\le x i ≤ x 的 w i ← w i − 1 w_i\leftarrow w_i-1 w i ← w i − 1 。考虑后一项会发生什么变化,我们发现由于树的 BFS 序就是 1 , 2 , ⋯ , n 1,2,\cdots,n 1 , 2 , ⋯ , n ,因此 u u u 的子树内一定完全是空的,祖先一定是满的。因此,设 v v v 是 u u u 的父亲,显然只有 i ≤ x i\le x i ≤ x 的 w i w_i w i 会发生改变,具体地:
当 i ≤ d v i \le d_v i ≤ d v 时这个子树并中未填的点的个数会 − 1 -1 − 1 ,导致实际的 w i w_i w i 不改变;
当 d v < i ≤ x d_v<i\le x d v < i ≤ x 时,子树并会多出 size u − 1 \text{size}_u-1 size u − 1 ,导致实际的 w i w_i w i 的变化为 w i ← w i − size u w_i\leftarrow w_i-\text{size}_u w i ← w i − size u 。
因此,实际的影响就是:对所有 d v < i ≤ d u d_v<i\le d_u d v < i ≤ d u ,令 w i ← w i − size u w_i\leftarrow w_i-\text{size}_u w i ← w i − size u 。那么要想维持 w i ≥ 0 w_i\ge 0 w i ≥ 0 ,就只需要找到 d v d_v d v 后面的最大的 x x x ,使得对 i ∈ ( d v , x ] i\in (d_v,x] i ∈ ( d v , x ] ,均有 w i ≥ size u w_i\ge \text{size}_u w i ≥ size u ,然后将这个区间都减去 size u \text{size}_u size u 。线段树维护即可,时间复杂度 O ( n log n ) O(n\log n) O ( n log n ) 。
E
LOJ6669 难度 3
首先指出本题我们需要的两个工具:
询问每个点 u u u 到 1 1 1 的距离就可以知道每个点的深度 dep u \text{dep}_u dep u 。
接下来,如果我们已经确定了 u u u 的每一级祖先,询问 d ( u , v ) d(u,v) d ( u , v ) 即可得到 LCA ( u , v ) = z \text{LCA}(u,v)=z LCA ( u , v ) = z 的深度(具体地,dep z \text{dep}_z dep z 满足 $\text{dep}_u+\text{dep}_v-2\times \text{dep}_z=d(u,v)$),进而得到 LCA ( u , v ) \text{LCA}(u,v) LCA ( u , v ) 。
考虑按照 BFS 序,即深度从小到大的顺序构建整棵树,并维护这棵树实时的轻重链剖分结果。
加入一个新一层的点 u u u 时,我们先找到 1 1 1 所在重链的链底 x x x ,找到 LCA ( u , x ) = y \text{LCA}(u,x)=y LCA ( u , x ) = y 。如果 y = x y=x y = x ,说明 u u u 的父亲就是 x x x ,我们就确定了 u u u 的父亲;否则,u u u 一定在 y y y 的另一个子树内(注意树是二叉树,因此一定可以确定到底是哪个子树)。这样只会跳 O ( log n ) O(\log n) O ( log n ) 次轻边,可以在 O ( n log n ) O(n\log n) O ( n log n ) 次询问内确定所有点的父亲。
询问复杂度 O ( n log n ) O(n\log n) O ( n log n ) ,时间复杂度 O ( n 2 ) O(n^2) O ( n 2 ) 。
F
G
QOJ4549 难度 3
f ( u ) f(u) f ( u ) 表示 u u u 子树的 SG 值,那么转移相当于选一个 v v v ,删掉这条链后必然会形成若干子树,该后继的 SG 值就是这些子树的 SG 值的 xor 和。最后还需要对这些东西取 mex。
考虑所有这些后继状态,发现如果我们设 S ( u ) S(u) S ( u ) 表示 u u u 子树的所有后继状态的 SG 值构成的集合,实际上对于一个点 u u u ,设其儿子分别为 v 1 , ⋯ , v k v_1,\cdots,v_k v 1 , ⋯ , v k ,那么他的 S ( u ) S(u) S ( u ) 就是:将每个 S ( v i ) S(v_i) S ( v i ) 异或上所有 j ≠ i j\neq i j = i 的 f ( v j ) f(v_j) f ( v j ) ,然后再取并集,再插入所有 f ( v i ) f(v_i) f ( v i ) 的异或(表示第一次操作删除了 u u u 自己)。
那么我们就是要用数据结构维护一个集合,支持全局异或,插入,合并,查询全局 mex 这三种操作。
使用 01trie 维护即可,单组数据复杂度 O ( n log n ) O(n\log n) O ( n log n ) 。
H
Luogu5287 难度 4
我们来刻画本题这样的字符串的 border:可以发现,一些后缀段能和一些前缀段构成 border,需要他们除了开头和结尾之外的二元组 ( x , c ) (x,c) ( x , c ) 都完全相同。对于首尾两个二元组,需要后缀的开头段比前缀长,前缀的结尾段比后缀长。
考虑直接把二元组 ( x , c ) (x,c) ( x , c ) 当作字符来进行字符串匹配。我们考虑加入一个 ( x , c ) (x,c) ( x , c ) 对答案的贡献。如果没有撤销操作,我们可以直接暴力跳 fail link 并记录当前遇到的所有节点中 c c c 这条出边长度的前缀最大值 w 1 w_1 w 1 ,每遇到一个更大的 w 2 w_2 w 2 ,设这里前面的总长度为 L L L ,我们就给答案加上 ∑ i = w 1 + 1 w 2 L + i \sum_{i=w_1+1}^{w_2}L+i ∑ i = w 1 + 1 w 2 L + i ;当遇到和 ( x , c ) (x,c) ( x , c ) 完全相同的二元组时停下。时间复杂度和 kmp 相同。
注意 kmp 的复杂度是均摊的,即使我们能够存下所有的版本,也不能在扩展新版本时直接由原版本暴力跳 fail link 扩展而来此时有两种做法。
注意到一个字符串 s s s 的所有 border 构成 O ( log ∣ s ∣ ) O(\log|s|) O ( log ∣ s ∣ ) 段等差数列,我们考虑利用这一性质优化跳 fail link 的过程。具体来说,我们对当前的 s [ 1 ⋯ k ] s[1\cdots k] s [ 1 ⋯ k ] 考虑其最长 border,设其为 k − d k-d k − d ,那么 d d d 是 s [ 1 ⋯ k ] s[1\cdots k] s [ 1 ⋯ k ] 的周期。由弱周期引理,所有 ≤ k − d \le k-d ≤ k − d 的数中只有 d d d 的倍数是周期(因为弱周期引理需要 p + q ≤ ∣ s ∣ p+q\le |s| p + q ≤ ∣ s ∣ ),这对应着所有长度 ≥ d \ge d ≥ d 的位置只有形如 k − x d k-xd k − x d 的位置是 border(并且进一步由于 d d d 是周期,这些 border 的下一个字符总是相同的)。
因此我们只需要令 k ← k m o d d + d k\leftarrow k\bmod d+d k ← k mod d + d ,即最小的一个 ≥ d \ge d ≥ d 的形如 k − x d k-xd k − x d 的位置,即可。这里很多地方想要解释 + d +d + d 的原因,但实际上注意上面我们的论断都需要弱周期引理那个 p + q ≤ ∣ s ∣ p+q\le |s| p + q ≤ ∣ s ∣ 的条件,因此只能说明长度 ≥ d \ge d ≥ d 的位置中有且仅有 k − x d k-xd k − x d 这些 border,如果贸然跳到 k m o d d k\bmod d k mod d 就可能会错误地漏掉若干 border。
回到本题。我们上面说过,所有 ≥ d \ge d ≥ d 的长度形如 k − x d k-xd k − x d 的位置均为 border,且这些 border(除了最后一个)后面的字符相同 ,由于我们需要维护的是前缀最大值,因此这些字符的贡献都被 k k k 这一位置覆盖,可以直接忽略他们。注意由于最后一个 border 的字符不同,我们需要先小跳一步计算贡献,然后再跳等差数列。因此就可以在不均摊的 O ( log n ) O(\log n) O ( log n ) 时间内完成跳 fail link 的过程了。只需要把操作离线并建立操作树即可。
I
J
Luogu11585 难度 4
建笛卡尔树,那么答案一定是选笛卡尔树上的一个矩形。容易做到 O ( n ) O(n) O ( n ) 。
如果两个矩形横坐标区间不交,只需要枚举分界点 i i i ,计算在直线 x = i x=i x = i 前后的最大矩形面积,相加即可。
对于相交的情况,两个一定在笛卡尔树上成祖孙关系,考虑如果选了 u , v u,v u , v 这两个点,其中 u u u 是 v v v 的祖先,其贡献为 − l e n v × h u + l e n u × h u + l e n v × h v -len_v\times h_u+len_u\times h_u+len_v\times h_v − l e n v × h u + l e n u × h u + l e n v × h v 。
在祖先处统计,李超树合并维护 ( − l e n , l e n × h ) (-len,len\times h) ( − l e n , l e n × h ) 的这些直线即可。
对于三个矩形的横坐标区间互不相交的情况,DP 即可。
如果前两个矩形的横坐标区间都和第三个不交,类似 k = 2 k=2 k = 2 的两个不交的部分做一遍即可。
设选的三个矩形对应到笛卡尔树上的节点分别为 u , v , w u,v,w u , v , w 。
如果 u , v , w u,v,w u , v , w 依次为祖孙关系就只需要把 k = 2 k=2 k = 2 的再做一遍。
具体来说我们设 G v G_v G v 表示选一个 v v v 和 v v v 的子孙 w w w ,其 − l e n w × h v + l e n v × h v + l e n w × h w -len_w\times h_v+len_v\times h_v+len_w\times h_w − l e n w × h v + l e n v × h v + l e n w × h w 的最大值,再设 H u H_u H u 表示选一个 u u u 和 u u u 的子孙 v v v ,其 − l e n v × h u + l e n u × h u + G v -len_v\times h_u+len_u\times h_u+G_v − l e n v × h u + l e n u × h u + G v 的最大值,两个都可以用李超树优化。
剩下的唯一情况是选一个祖先 u u u ,然后选两个 v , w v,w v , w 满足 v , w v,w v , w 互不为祖孙关系,造成的贡献为
我们考虑放宽限制,发现当 u u u 不为 v , w v,w v , w 的祖先时,这个东西不会算的更大。考虑对 u u u 不做任何限制,只钦定 v , w v,w v , w 不交。那么如果没有不交的限制,我们需要对一个 ( − l e n i , l e n i × h i ) (-len_i,len_i\times h_i) ( − l e n i , l e n i × h i ) 这样的东西求一下凸包,然后和自己做闵可夫斯基和。
考虑如何处理不交的限制。对序列建线段树,每个子树变成一个区间 [ l , r ] [l,r] [ l , r ] ,考虑两个不交区间 [ l 1 , r 1 ] , [ l 2 , r 2 ] [l_1,r_1],[l_2,r_2] [ l 1 , r 1 ] , [ l 2 , r 2 ] ,不妨设 r 1 < l 2 r_1<l_2 r 1 < l 2 ,我们在 LCA ( r 1 , l 2 ) \text{LCA}(r_1,l_2) LCA ( r 1 , l 2 ) 处统计这个贡献。
具体来说,我们对每个线段树节点维护两个凸包 L , R L,R L , R ,然后对每个区间 [ l , r ] [l,r] [ l , r ] ,我们在 l l l 的所有祖先的 L L L 凸包里面插入这个点,r r r 的所有祖先的 R R R 凸包里面插入这个点,然后我们对每个线段树节点,把他左儿子的 R R R 凸包和右儿子的 L L L 凸包做闵可夫斯基和,把得到的这些点放到总的点集里面,最后再对总的点集求一遍凸包。求出这个凸包之后,再枚举 u u u 计算即可。
实现的时候写成分治的形式可以减小一部分常数。综上,总复杂度 O ( n log n ) O(n\log n) O ( n log n ) 。
K
LOJ3341 难度 5
分块。设分出来左散块 A 1 A_1 A 1 ,中间块 B 1 , ⋯ , B k B_1,\cdots,B_k B 1 , ⋯ , B k ,右散块 A 2 A_2 A 2 。那么贡献有 A 1 ← A 1 A_1\leftarrow A_1 A 1 ← A 1 即散块对自己,A 1 ← A 2 A_1\leftarrow A_2 A 1 ← A 2 即散块对散块,A i ← B j A_i\leftarrow B_j A i ← B j 即散块对整块,B i ← B j ( i ≠ j ) B_i\leftarrow B_j(i\neq j) B i ← B j ( i = j ) 即整块对整块,B i ← B i B_i\leftarrow B_i B i ← B i 即整块自己。当然还有同块的情况。
首先带散块的都好做:我们总能拆成 O ( n ) O(\sqrt{n}) O ( n ) 次查询区间 [ l , r ] [l,r] [ l , r ] 内有多少 [ x , y ] [x,y] [ x , y ] 中的数这样的询问(下面记这样的查询为查询 c ( l , r , x , y ) c(l,r,x,y) c ( l , r , x , y ) ),离线下来值域分块平衡复杂度即可。
这部分的时间复杂度为 O ( q B + n n ) O(qB+n\sqrt{n}) O ( qB + n n ) 。
如果想要空间线性,发现 A 1 ← B , A 1 ← A 2 A_1\leftarrow B,A_1\leftarrow A_2 A 1 ← B , A 1 ← A 2 这样的都可以直接在端点处挂一个区间。
但 A 1 ← A 1 A_1\leftarrow A_1 A 1 ← A 1 怎么算呢,我们可以把他当作同块,用同块的方法计算。这个我们最后说。
对于整块的情况,首先考虑 B i ← B i B_i\leftarrow B_i B i ← B i ,发现由于一块内只有 O ( B ) O(B) O ( B ) 个数,我们预处理 ans ( x , y ) \text{ans}(x,y) ans ( x , y ) 表示如果询问的 u , d u,d u , d 在块内排名分别是 x , y x,y x , y 的答案即可。这部分复杂度为 O ( n B + q n B ) O(nB+\frac{qn}{B}) O ( n B + B q n ) 。为了找排名还需要处理 rank ( i , j ) \text{rank}(i,j) rank ( i , j ) 表示 i i i 这个数在 j j j 块中的排名,这部分也是 O ( n B ) O(nB) O ( n B ) 。
然后再考虑 B i ← B j B_i\leftarrow B_j B i ← B j 。考虑差分成值域 [ 1 , d ] − [ 1 , u − 1 ] − [ 1 , u − 1 ] × [ u , d ] [1,d]-[1,u-1]-[1,u-1]\times [u,d] [ 1 , d ] − [ 1 , u − 1 ] − [ 1 , u − 1 ] × [ u , d ] ,发现最后一种是好算的:只需要查询 [ l , r ] [l,r] [ l , r ] 这些块 中值在 [ x , y ] [x,y] [ x , y ] 中的元素个数 ( 1 ≤ l , r ≤ n B ) (1\le l,r\le \frac{n}{B}) ( 1 ≤ l , r ≤ B n ) 。
考虑 [ 1 , u − 1 ] × [ u , d ] [1,u-1]\times [u,d] [ 1 , u − 1 ] × [ u , d ] 怎么算,写一下式子,设 L , R L,R L , R 为这些整块的左右边界,g ( l , r , x , y ) g(l,r,x,y) g ( l , r , x , y ) 表示 l ⋯ r l\cdots r l ⋯ r 这些块 中值在 [ x , y ] [x,y] [ x , y ] 中的元素个数,那么这部分就是
那这样就很容易做到线性空间了。
如果想要空间线性,只需要对每块单独做。
那还需要查询一些块的 [ 1 , d ] [1,d] [ 1 , d ] 的贡献。考虑从小到大加入每个数,并维护 s i , j s_{i,j} s i , j 表示 [ i , j − 1 ] [i,j-1] [ i , j − 1 ] 中的块 对第 j j j 块的答案贡献,那么如果在 x x x 这个块内插入了一个数,只会把 s i , x ← s i , x + cnt ( i , x − 1 ) s_{i,x}\leftarrow s_{i,x}+\text{cnt}(i,x-1) s i , x ← s i , x + cnt ( i , x − 1 ) ,其中 cnt ( l , r ) \text{cnt}(l,r) cnt ( l , r ) 表示当前 [ l , r ] [l,r] [ l , r ] 这些块内已经插入了多少个数。cnt \text{cnt} cnt 可以用前缀和维护。
[ l , r ] [l,r] [ l , r ] 块的答案就是 ∑ i = l r s l , i \sum_{i=l}^rs_{l,i} ∑ i = l r s l , i 。那这部分复杂度是 O ( n 2 B ) O(\frac{n^2}{B}) O ( B n 2 ) ,且空间复杂度天然是线性。
对于同块的情况,朴素的想法是直接拆成 O ( n ) O(\sqrt{n}) O ( n ) 次查询 c ( l , r , x , y ) c(l,r,x,y) c ( l , r , x , y ) ,这样就可以过了。
有一个加强版是 Luogu6579,需要线性空间。考虑再分一次块,把这个散块分成长度为 S S S 的块,每块内直接暴力 O ( S 2 ) O(S^2) O ( S 2 ) 算,块之间就直接加询问,那么这部分的时间复杂度是 O ( q B S + q B S ) O(\frac{qB}{S}+qBS) O ( S qB + qBS ) 。注意由于暴力的那些块长加起来是 B B B ,因此暴力的复杂度是 O ( B S ) O(BS) O ( BS ) 而非 O ( B S 2 ) O(BS^2) O ( B S 2 ) 。
但空间复杂度是 O ( q B S ) O(\frac{qB}{S}) O ( S qB ) ,我们可以偷偷调整 B B B 和 S S S 的值(不是)并假装他是线性。
于是总的复杂度是 O ( ( n + q ) n ) O((n+q)\sqrt{n}) O (( n + q ) n ) ,空间是(迫真)线性的,实测可以通过 P6579。