Gem

本题来源是出题人在 NOIP 联训中做到的一道题,当时的数据范围是本题的第二个 Subtask。当时出题人在这道题上 MLE 并得到了 0 分的好成绩。

下面的表述中,我们认为 \(0\) 对应红宝石,\(1\) 对应蓝宝石,整个序列为一个 \(01\) 序列。

考虑记前缀和的最大值为 \(S_\max\),最小值为 \(S_\min\),于是总的限制为 \(|S_\max-S_\min|\leq k\)

考虑反向维护这个限制,即枚举一个 \(i\),然后钦定 \(i\leq S_\min\leq S_\max\leq i+k\),计算对应的序列个数。然后考虑一个实际差值为 \(\Delta=|S_\max-S_\min|\) 的序列,会被统计 \(k-\Delta+1\) 次。记 \(calc(k)\) 为上述过程计算出的序列个数,于是有最终答案为 \(calc(k)-calc(k-1)\)

考虑 \(calc(k)\) 如何计算。考虑把一个 \(0\) 看做是在平面直角坐标系上让 \(x\) 坐标 \(+1\),一个 \(1\) 为让 \(y\) 坐标 \(+1\),于是问题转化为,从 \((0,0)\) 出发,任意时刻在 \(y=x+i\)\(y=x+i+k\) 之间,每次可以向右或向上走一步,问走到 \(n\) 的方案数,容易发现此即「骗我呢」的经典翻折容斥。

我们考虑条件为不能经过 \(y=x+i-1\)\(y=x+i+k+1\)。我们记一次经过第一条直线的事件为 \(A\),第二条直线为 \(B\),我们考虑对形如 \(AABABBBA\cdots\) 的前缀做容斥。我们把所有 \(A\) 合并在一起,所有 \(B\) 合并在一起,变成 \(ABABA\cdots\),然后一次经过 \(A\) 可以用经典卡特兰容斥理解为沿着 \(y=x+i-1\) 翻折。同理 \(AB\) 即为先沿着 \(y=x+i-1\) 翻折,再沿着 \(y=x+i+k+1\) 翻折。我们减去翻折了奇数次的结果,加上翻折了偶数次的结果,即可得到最后答案。

下面是一些简单的复杂度分析:当 \(k>\max(n,m)\) 时结果必然为 \(\binom{n+m}{n}\),于是可以认为 \(k,n,m\) 同阶。考虑我们将 \((x,y)\) 翻折两次后会变成 \((x+k,y-k)\),于是这个过程最多进行 \(\mathcal O(\frac nk)\) 次即会停止。我们一共会计算这样的东西 \(k\) 次(因为必须包含 \((0,0)\)),所以总复杂度为 \(\mathcal O(k\cdot \frac nk)=\mathcal O(n)\)

致歉:本题和 IOI2022 集训队互测的一道题部分做法大体相同,但是出题本身是在集训队互测前。且考虑到参与联考的选手大多没能参与集训队互测,所以出题人还是放了出来。

Sale

容易发现转移只用维护100个点和一个前缀和,用矩阵快速幂优化即可

我们有两个朴素的思路:预处理所有询问串的答案,或者是每次查询暴力枚举。

于是考虑平衡二者。对于前 \(K\) 位,我们预处理其所有可能的询问;对于后 \(n-K\) 位,我们预处理时只考虑 \(2^{n-K}\) 种情况,查询时 \(2^{n-K}\) 枚举。

总复杂度 \(O(nm+2^{n-K}q+2^{n-K}3^K)\),取 \(K=\log_3 q+O(1)\) 时复杂度最优;姑且取 \(K=\log_3 q\),则复杂度为 \(O(nm+2^n q^{1-\log_3 2})\approx O(nm+2^n q^{0.37})\)

题外话 1:原计划这题该作为 UTF-8 那题的转移系数出现的,然而那场比赛原本的 T1 被疯狂加 0,UTF-8 被赶鸭子上架换掉 T1,就没有二合一。

题外话 2:本题被发现与 LOJ 2351 相同,于是出题人尽力开大了 \(q\),意欲卡掉 \(2^{\frac{n}{3}}q\) 的做法,然而没有完全成功。

题外话 3:本题的 grader 精心选取了参数,使得其既能接近 std(以及 LOJ 做法)的极限复杂度,又能让各个点生成数据的速度接近(分支预测对于数据生成速度有较大影响)。另外允许离线是为了缓存友好;在在线要求下,std 会在一个循环处出现「循环次数越多跑得越快」的怪异情况。

Single

本题是这场考试隐藏的签到题。

考虑对每种活动区间 \([l,r]\) 增加两维 \(l',r'\) 分别表示移除左边界挡板和右边界挡板之后的活动范围为 \((l',r)\)\((l,r')\)。那么两个区间 \((l_1,r_1,l_1',r_1')\),\((l_2,r_2,l_2',r_2')\) 能够同时坐人当且仅当 \(l_1\ge r_2'\)\(l_2'\ge r_1\)

由于不同的区间最多只有 \(4n\) 个,于是可以直接扫描线+set 维护找到。将所有区间按 \(r'\) 排序,记录 \(f_i/g_i\) 表示考虑了前 \(i\) 个区间,此时最多能坐多少人,并且在坐最多人的基础上最小的 \(r\)。那么对于某个区间 \((l,r,l',r')\) 有转移:

\[(f_{r'},g_{r'})\gets(f_{l}+1,r)\ \text{if}\ (g_l\le l')\\ (f_i,g_i)\gets (f_{i-1},g_{i-1}) \]

对坐标离散化即可 \(\mathcal O(n\log n)\) 解决这一问题。

posted on 2021-11-11 21:58  漠寒·  阅读(56)  评论(0编辑  收藏  举报