QDEZ集训
Day 1
比赛:NOI模拟赛 Day1
总结
| 题目 | T1 | T2 | T3 |
|---|---|---|---|
| 分数 | \(40({\color{green}{100}})\) | \(0\) | \(5\) |
| 应得分数 | \(60\) | / | / |
| 知识点 | dp(优化),数学,数据结构(笛卡尔树) | 数据结构 | 构造,网络流 |
| 难度 | \(\color{blue}{3}\) | \(\color{darkblue}{4}\) | \(\color{darkblue}{4}\) |
| 场上通过人数 | \(113/173=65\%\) | / | / |
T1 路灯
场上想到的: 按照高度从大到小扫就可以确定扫到的面积,然后设计 \(f(i,l,r)\) 表示确定了前 \(i\) 大塔的方向,目前还没有被覆盖的区间是 \([l,r]\) 时的期望。设第 \(i\) 大塔的高度为 \(h\),其所在位置为 \(p\),得到转移:
- 当 \(p\not\in [l,r]\):
- 当 \(p\in [l,r]\):
然后就可以暴力转移做到 \(O(n^3)\)。
未能继续思考的原因: 没有注意到 \((l,r)\) 的特性,并且没有充分思考dp做法。
正解: 观察一下转移式,我们发现如果将目前已经加入的点分别记为 \(a_0=0,a_1,a_2,\dots,a_m,a_{m+1}=n+1\),那么 \((l,r)\) 一定是其中的一组 \((a_k,a_{k+1})\),即 \(l,r\) 一定紧贴。那么有用的 \((l,r)\) 其实就退化到了 \(O(n)\) 级别,于是就可以做到 \(O(n^2)\),获得 \(\mathrm{60pts}\)。
考虑进一步地优化。我们将序列看作被一些段切开,那么这样一层一层转移时,相当于不断用 \(p\) 去切开其中的某一段。由此我们发现,只有 \(p\in[l,r]\),即 \(p\) 正好切开的那一段需要真正转移,其他的段没有被切开,只需要不断 \(\times \frac{1}{2}\),并且对答案的贡献就是一个等比数列状物,可以直接计算。
如何模拟这个过程?由于我们就是按照 \(h\) 从大到小转移的,所以考虑按笛卡尔树转移。这个笛卡尔树的结构就代表了段切开的过程。并且在父子关系上,设 \(h_{\mathrm{father}}=lst\),那么从 \(lst-1\) 到 \(h+1\) 的这 \((lst-h-1)\) 层中,当前段的贡献是可以直接计算出来的。具体的,设层数 \(d=lst-h-1,len=r-l\),则对答案的总贡献即为:
是可以直接计算的。
因此这样我们就只需要考虑分裂时的复杂度了,就是 \(O(n)\) 的。
加上逆元,时间复杂度是 \(O(n\log mod)\)。
Day 2
比赛:NOI模拟赛 Day2
总结
| 题目 | T1 | T2 | T3 |
|---|---|---|---|
| 分数 | \(20({\color{green}{100}})\) | \(25\) | \(0\) |
| 应得分数 | \(20\) | \(25\) | \(5\) |
| 知识点 | 构造、交互 | 数据结构(分块) | 神秘 |
| 难度 | \(\color{darkgreen}{2+}\) | \(\color{brown}{3}\) | \(\color{darkblue}{4}\) |
| 场上通过人数 | \(53/173=30\%\) | / | / |
T1 线性卷积
赛时做法: 注意到通过 \([1,2,\dots, n]\) 的轮换,可以每次确定换到后面的数和剩余数的所有边,且最后一次询问可以省掉,于是就是 \((n-1)\) 次询问,有 \(20\mathrm{pts}\)。根据信息论,要得到总共 \(\frac{n(n-1)}{2}\) 条边的信息显然需要至少 \(\frac{n}{2}\) 次询问,因此每次询问要将信息充分利用,而这个解法每次可以确定的信息不够多。
正解:
想不到就是想不到。考虑特殊性质 \(n\) 为偶数,将序列对半劈开,考虑这样构造:

每次将靠近分界线的两个数扔到对面边的末尾。我们发现这样就可以做到通过 \(\frac{n}{2}+1\) 次询问得出除了换出去的两个点之间的边的所有边。并且再观察一下,由于这些点到其他点边的状态都是已知的,通过第一次询问的答案可以进一步推出这些点之间的边状态。
进一步推广到奇数,将 \(1\) 放在开头不动,确定完其他边之后带回第一次询问就可以直接推出 \(1\) 的所有边。做完了。
T2 平方矩乘
先考虑第一维,我们需要设法解决修改和询问的不统一,修改是对 \(P_i\) 限定范围,而询问时对 \(i\) 限定范围。这里我们考虑固定住 \(i\) 这一维,按 \(i\) 这一维分块,对于每一块内,将 \(P_i\) 排序。这样在修改时,我们可以扫描每一块,由于 \(P_i\) 已排序,修改在每一块内就会体现为一段区间,用二分即可找到。在询问时,整块可以直接查询,我们将查询挂在这一整块上,而散块由于块内的排序位置了变化,我们找到其对应的 \(P_i\) 位置并挂为单点询问即可。
对于第二维,考虑对每块进行扫描线,维护一棵线段树,在一维上的区间加可以转化为差分,这样我们的线段树需要支持区间加、区间最大值查询、区间历史最值查询。使用历史最值线段树,维护一个最大增量即可。
时间复杂度 \(O(n\sqrt{n}\log n)\),无法通过。
Day 3
发烧了
Day 4
比赛:UNR Day1
| 题目 | T1 | T2 | T3 |
|---|---|---|---|
| 分数 | \(50({\color{green}{100}})\) | \(7\) | \(0\) |
| 应得分数 | \(100\) | \(7\) | \(5\) |
| 知识点 | 思维(结构刻画)+前缀和 | 组合计数+dp | 倍增+字符串 |
| 难度 | \(\color{darkgreen}{2}\) | \(\color{darkblue}{4}\) | \(\color{brown}{3}\) |
| 场上通过人数 | \(460/550=83\%\) | / | / |
T1 麦田
赛时想到的: 注意到最终高度与顺序无关,然后发现正着做一遍再反着做一遍就是对的,很快获得 \(50\mathrm{pts}\),然而这个结构无法进一步优化就倒闭了。
没有想到正解的原因: 没有在见到区间询问时思考拆贡献的思想。
正解: 拆一下贡献,考虑 \(a_i\) 可以变到的高度如何刻画。
考虑找到 \(a_i\) 左侧的 \(L_i\) 其满足 \(a_{L_i}>a_{L_i+1}<a_{L_i+2}<\dots<a_i\),这样 \(a_{L_i}\) 就可以向右推。同理找到 \(a_i\) 右侧的 \(R_i\) 其满足 \(a_i>a_{i+1}>\dots>a_{R_i-1}<a_{R_i}\)。这样 \(L_i,a_i,R_i\) 构成了一个W型,此时如果 \(a_{L_i}>a_i\) 且 \(a_{R_i}>a_i\),那么两边就可以往里推最后使得 \(a_i\) 升高到 \(\max(a_{L_i},a_{R_i})\),我们发现这个结构可以完美刻画贡献!其贡献就是如果区间包含 \([L_i,R_i]\),那么会贡献 \(\max(a_{L_i},a_{R_i})-a_i\),本质就是一个二维偏序,直接做是一只log,不过注意到 \(L_i,R_i\) 都是单调的,直接用前缀和就可以做到线性。
T3 字符串
考虑 \(s[l,r]<\mathrm{rev}(s[l,r])\) 如何刻画,分析可以发现,我们找到任意 \(k\ge \left\lfloor\frac{r-l+1}{2}\right\rfloor\),如果有 \(s[l,l+k-1]<\mathrm{rev}(s[r-k+1,r])\) 就成立,考虑取 \(b=\left\lfloor\log_2(r-l+1)\right\rfloor,k=2^b\),容易发现这个 \(k\) 是满足条件的,原来的条件就转化为了:\(s[l,l+2^b-1]<\mathrm{rev}(s[r-2^b+1,r])\),这就是一个后缀数组的中间步骤的形式,直接 \(S^{\prime}=S+\#+\mathrm{rev}(S)\),跑后缀数组时,原来的条件就进一步转化为 \(rk_{b,l}<rk_{b,r^{\prime}}\),那么原问题的 \(k\) 就是所有满足 \(rk_{b(l,k),l}<rk_{b(l,k),k^{\prime}}\) 的位置。
考虑按照 \(b(l,k)=u\) 分类,令 \(b(l,r)=K\),可以分为两类:
-
对于 \(u<K\),要有 \(k\in[l+2^u-1,l+2^{u+1}-2]\)
-
对于 \(u=K\),要有 \(k\in[l+2^K-1,r]\)
直接拆分成 \(\log\) 个询问插到对应的层里,最后拼接即可。从低往高跑后缀数组时直接对 \(rk\) 扫描线即可,再用线段树维护多项式,可以做到 \(O(n\log n+q\log^2 n)\),无法通过。考虑优化,注意到类型1只和 \(l,u\) 相关,那么我们直接将第一类分成 \(n\log n\) 个询问,第二类询问只有 \(q\) 个,这样时间复杂度变成 \(O(n\log^2 n+q\log n)\),可以通过。
Day 5
比赛:UNR Day2
| 题目 | T1 | T2 | T3 |
|---|---|---|---|
| 分数 | \({\color{green}{100}}\) | \(0\) | \(8\) |
| 应得分数 | \(100\) | \(20\) | \(20\) |
| 知识点 | 思维(结构刻画)+dp | 图计数 | 神秘 |
| 难度 | \(\color{darkgreen}{2-}\) | \(\color{darkblue}{4}\) | \(\color{darkblue}{4}\) |
| 场上通过人数 | \(310/550=56\%\) | / | / |
Day 6
比赛:NOI模拟赛 Day3
T1 数据结构
考虑如何高效扫描这些全0矩阵。考虑枚举列 \(y\) 表示这些全0矩阵的右端点,对每个点 \((x,y)\),求出其左侧第一个 \(1\) 的位置,那么这些 \((x,y)\) 往左侧伸出的连续0个数就是 \(x-L_{x,y}\),再枚举 \([l,r]\) 表示其上下边界

那么此时对答案造成的贡献 \(W_y(l,r)=y-\max\limits_{l\le x\le r} L_{x,y}\)。但是注意到还有左边界 \(c\) 的限制,后面的东西还要和 \(c\) 取 \(\max\),我们先不考虑左边界的限制,即先考虑 \(c=1\) 的情况。
此时答案就是 \(\sum\limits_{c\le y\le d}\sum\limits_{a\le l\le r\le b} W_y(l,r)\),内层是一个二维前缀和可以预处理,因此时间复杂度 \(O(n)\),于是我们做到了 \(O(n^3+qn)\) 解决 \(c=1\) 的情况。
思考怎么去掉 \(c\) 对贡献的制约,如果直接按 \(c=1\) 计算,可能会计算到左边界 \(<c\) 的矩形,因此我们容斥一下,减去左边界在 \([1,c)\),右边界在 \([c,d]\) 的矩形。
考虑离线下来扫描线,在扫描到 \(y=c-1\) 时处理。我们需要得到往右边伸的长度,记其为 \(v_x=\min(R_{x,y}-1,d)-y\),于是我们得到这一部分的贡献为
已经对 \(W_y(l,r)\) 做了二维前缀和,于是我们用单调栈求出 \(v_x\) 的支配区间即可 \(O(n)\) 算出贡献。
总时间复杂度 \(O(n^3+qn)\)。
Day 7
比赛:NOI模拟赛 Day4
赛时分析到的: 先考虑刻画条件,\(i\) 的倍数区间必包含位置 \(i\),对于限制 \((P,Q)\),即 \(P_i\notin S_{Q_i}\),记 \(mxl_i=\max\limits_{Q_k=i} P_i+1\),那么需要有 \(L_i\ge mxl_i\)。让我们最大化 \(\sum\limits_{i=1}^n|S_i|\)。注意到倍数的传递性,那么就有 \(\forall y\in [L_x,R_x],[L_y,R_y]\subseteq [L_x,R_x]\)。
没有做出的原因: 没有进一步挖掘区间之间的性质,而是将其刻画成了更加复杂的形态。
正解: 直接考虑 \(\forall y\in [L_x,R_x],[L_y,R_y]\subseteq [L_x,R_x]\) 意味着什么,就是任意两个区间没有交叉的情况,也就是构成要么分离,要么相互包含的结构。注意到这个结构就可以发现其非常适合区间 \(\mathrm{dp}\)。
直接令 \(f(l,r)\) 表示考虑区间 \([l,r]\),其中 \(\forall i\in[l,r],S_i\subseteq[l,r]\) 的最大贡献。
首先可以没有点取到 \([l,r]\),那这时可以分为左右两个独立的部分,得到转移 \(f(l,r)=\max\limits_k f(l,k)+f(k+1,r)\)。
考虑有哪些点可以取到 \([l,r]\),不难发现这些点要满足 \(mxl_i\ge l\),那么我们可以从其中选一些取到 \([l,r]\),然后剩下的部分就分成了独立的几块,这再用一个 \(\mathrm{dp}\) 求出最大贡献即可。令 \(g_i\) 表示考虑 \([l,i]\) 中的点,且 \(i\) 取到 \([l,r]\) 时的最大贡献,转移为 \(g_i=\max\limits_{k=l-1}^{i-1} \set{g_k+f(k+1,i-1)+r-l+1}\)。贡献 \(g_i+f(i+1,r)\rightarrow f(l,r)\) 即可。
时间复杂度 \(O(n^4)\)。

浙公网安备 33010602011771号