Loading

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]\)

\[f(i,l,r)\leftarrow \frac{1}{2}f(i-1,l,r) \\ \mathrm{Ans}\leftarrow^+ f(i-1,l,r)\cdot 2^{(r-l)h} \]

  • \(p\in [l,r]\)

\[f(i,l,p)\leftarrow f(i-1,l,r)\cdot 2^{(r-p)h-1} \\ f(i,p,r)\leftarrow f(i-1,l,r)\cdot 2^{(p-l)h-1} \]

然后就可以暴力转移做到 \(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\),则对答案的总贡献即为:

\[\begin{aligned} \mathrm{Sum} &= \sum_{i=1}^d \left(\frac{1}{2}\right)^i\cdot 2^{len\cdot(r-i)}\\ &=2^{len\cdot r}\sum_{i=1}^d 2^{-(len+1)i}\\ &=2^{len\cdot r}\frac{2^{-(len+1)}-2^{-(d+1)(len+1)}}{1-2^{-(len+1)}} \end{aligned} \]

是可以直接计算的。

因此这样我们就只需要考虑分裂时的复杂度了,就是 \(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\),于是我们得到这一部分的贡献为

\[\sum_{a\le l\le r\le b} W_y(l,r)\cdot\left(\min_{l\le x\le r} v_x\right) \]

已经对 \(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)\)

posted @ 2026-07-08 20:42  STDJCY  阅读(14)  评论(0)    收藏  举报