2022.5
5.2
T1
称一个非负整数序列是好的,当且仅当能通过以下两个操作全变成 \(0\),
- 选一个数减 \(2\);
- 选相邻两个数各减去 \(1\)。
给你长度为 \(n\) 的序列 \(a\),\(q\) 次询问 \([l,r]\),求 \([l,r]\) 有多少个子区间是好的。
\(1\leq n,q\leq 10^5,0\leq a_i\leq 10^9\)。
简单题。
容易有以下发现,考虑如何判定一个区间是好的,先找出该区间中的所有 \(0\),这些 \(0\) 把区间分成若干段,如果每段的和都是偶数,该区间就是好的。
所以直接上莫队 \(n\sqrt{q}\) 可以通过(我的做法),题解做法为 \(O((n+q)\log n)\) 的线段树离线扫描线。
当然也有在线做法,fyx orz。
T2
给出一个长度为 \(n\) 的序列 \(a\),有 \(m\) 个操作 \(l_i,r_i,x_i\),表示把 \(a_{l_i}\) 到 \(a_{r_i}\) 对 \(x_i\) 取 \(\min\)。然后 \(q\) 个询问 \(l1,r1,l2,r2\),对 \(a\) 执行第 \(l1\) 到 \(r1\) 个操作后,\(a_{l2}\) 到 \(a_{r2}\) 的和。
\(l1,r1\) 随机。
\(1\leq n,m\leq 15000,1\leq q\leq 10^5\)。
首先是回滚莫队套吉老师线段树的暴力,看上去是 \(O(m\sqrt{q}\log n)\) 的复杂度很对。但是线段树区间 chkmin 的复杂度是基于势能分析的均摊单次 \(O(\log n)\),在回滚中是无法保证复杂度的,不过好像也能过。
正解来源于 \(l1,r1\) 的随机,考虑把所有询问按 \(l1\) 递减排序,那么对应的的 \(r1\) 就是随机的,根据经典结论,随机序列的最长上升子序列长度为 \(O(\sqrt{n})\) 级别,那么 \(r1\) 的最长下降子序列是 \(O(\sqrt{q})\) 的,也就是说,可以划分成 \(O(\sqrt{q})\) 段最长不下降子序列(dilworth 定理)。
于是我们把询问划分成 \(O(\sqrt{q})\) 组,每组的 \(l1\) 单调不增,\(r1\) 单调不减,于是对于每组都可以吉老师线段树把所有操作做一遍得到该组所有询问的答案,总复杂度 \(O(m\sqrt{q}\log n)\) 是可以通过的。
有同学提出了一个不基于随机的做法,不太懂,但是好强 orz
T3
给出 \(n\) 个 \([0,2^k)\) 中的整数,对于每个 \(i\in[0,2^k)\) 求从这 \(n\) 个数中选 \(m\) 个使得异或和为 \(i\) 的方案数。
\(m\leq n\leq 1.3\times10^5,k\leq 17\),对 \(998244353\) 取模。
做完这个题一定会对异或 FWT 有更深刻的理解。
记 \(x\otimes y=\operatorname{popcount}(x\& y) \bmod 2\),这是异或 fwt 的核心运算,一个重要性质就是 \((x\otimes y)\operatorname{xor}(x\otimes z)=x\otimes(y\operatorname{xor}z)\)。
我们记 \(cnt_i\) 为 \(n\) 个数中 \(i\) 出现的次数,然后我们对 \(cnt\) 数组做 FWT 得到 \(\operatorname{FWT}(cnt)_i=\sum_{j\otimes i=0}cnt_j-\sum_{j\otimes i=1}cnt_j\)。然后我们记答案数组为 \(ans\),考虑 \(\operatorname{FWT}(ans)\) 与 \(\operatorname{FWT}(cnt)\) 的关系。
考虑一种选 \(m\) 个数异或和为 \(j\) 的方案,如果 \(j\otimes i=0\),它会贡献给 \(\operatorname{FWT}(ans)_i\) 正 \(1\),否则会贡献负 \(1\),我们记此方案中 \(m\) 个数分别为 \(a_1,a_2,\dots,a_m\),那么根据 \(\otimes\) 运算的性质,我们有 \(\operatorname{xor}_{k=1}^m(a_k\otimes i)=j\otimes i\)。
我们记 \(x=\sum_{j\otimes i=1}cnt_j\),那么 \(\sum_{j\otimes i=0}cnt_j\) 就等于 \(n-x\)(\(x\) 可以通过 \((n-\operatorname{FWT}(cnt)_i)/2\) 简单求出)。
现在我们考虑从 \(n\) 个数中选出 \(a_1\) 到 \(a_m\),如果它们之中有奇数个 \(\otimes\ i\) 等于 \(1\),该方案就会贡献给 \(\operatorname{FWT}(ans)_i\) 负 \(1\),否则贡献正 \(1\),所以我们枚举选了多少个 \(\otimes\ i\) 等于 \(1\) 的,就得到下式:
上面这个式子的值只和 \(x\) 有关,展开组合数会发现能写成卷积的形式。于是我们一次 NTT 就可以对于所有 \(x\in [0,n]\) 求出上式的值。
于是我们就得到了 \(\operatorname{FWT}(ans)\),一次 iFWT 就求出了 \(ans\)。复杂度 \(O(k2^k+n\log n)\)。
5.4
T1 结论题,结论目前不会证,先不写了,T3 还没改
T2
给你一颗树,一个区间 \([l,r]\) 是称作好的当且仅当对于任意 \(l\leq x\leq y\leq r\) 有 \(l\leq \operatorname{lca}(x,y)\leq r\)。\(q\) 个询问 \([L,R]\),求有 \([L,R]\) 有多少个子区间是好的。
\(n,q\leq 2\times 10^5\)。
首先反过来考虑,那些区间不是好的,对于 \(x,y\) 以及它们的 LCA \(z\),若有 \(z<x<y\),那么 \(z<l\leq x,r\geq y\) 的区间 \([l,r]\) 就都不是好的,我们把区间看成以左端点为横坐标,右端点为纵坐标的平面上的点,那么这就相当于一个矩形覆盖。\(x<y<z\) 同理。
如果枚举 \(x,y\),就会产生 \(O(n^2)\) 个矩形。不妨枚举 \(z\),用树上启发式合并枚举 \(x,y\),可以利用包含关系去除大部分矩形,只剩下 \(O(n\log n)\) 个矩形。
然后问题就变成了矩形覆盖,查询矩形区域内未被覆盖的面积,线段树扫描线做一做就好了。
时间复杂度 \(O(n\log^2n)\)。
T3
随机数据下的半平面查询问题
按每维坐标分块,平面分成 \(\sqrt{n}\times\sqrt{n}\) 个块,因为数据随机,每块中的点数为 \(O(1)\)。一个半平面的边界只会穿过 \(O(\sqrt{n})\) 个块,对这些散块暴力处理,整块对每行的块维护一个前缀和就做完了。时间复杂度 \(O(n\sqrt{n})\)。
非随机数据的做法,不会
5.6
T3 我会啊,但是你这个大样例水成什么样了/fn/fn,还卡常
T1
T2
T3
5.9
今天切了两题,感觉自己又行了(错觉)
T1
T2
T3
5.10
总共没写多少分,挂了 70 /qd
今天这题去年好像做过的......