ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

20211111

2021-11-11 22:02:42  阅读:155  来源: 互联网

标签:20211111 max 复杂度 翻折 出题 考虑 本题


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)\) 解决这一问题。

标签:20211111,max,复杂度,翻折,出题,考虑,本题
来源: https://www.cnblogs.com/zxhmh/p/15542105.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有