UOJ pjudge LOJ 试题乱做 Part4

概率太尼玛有意思了, 啊哈哈哈.

\(Alex\_Wei\) 唱歌好听!


\(\text{【LOJ\#2834】「JOISC 2018 Day 2」修行}\)

\(\color{red}{\text{[HARD]}}\)

概率真好van, 这个世界真奇妙, 其实网上的题解大多写的不太对, 或者说没写明白, 当然也有写清楚了的, 所以 ljy orz , 让我弄清楚了这题.

首先还是一个经典的变换, 我们取 \(n\) 个随机变量 \(a_i\in [0,1)\) , 我们所求即为恰好有 \(k-1\)\(a_i > a_{i+1}\) 的概率, 这等于满足要求的排列概率.

这里正确是因为我们只关注那 \(n-1\) 个是否为 \(0\)\(1\) 并不关注具体取值, 并且相邻两个取等的概率为 \(\frac{1}{\infty}\) , 即为 \(0\) .

考虑构造一个序列 \(b_i=[a_i<a_{i-1}]+a_i-a_{i-1}\) , 那么值域为 \(b_i\in[0,1)\) , 所以问题转化为 \(k-1\leqslant \sum{b_i}<k\) 的概率.

问题再次转化为在 \((0,0,\dots,0)\)\((1,1,\dots,1)\) 的超立方体中等概率的取一个点, 记为 \((c_1,c_2,\dots,c_n)\) , 设 \(f_{k}\) 为满足这个点 \(\sum{c_i}<k\) 的概率, 此时的 \(c_i\) 仍小于 \(1\) , 答案则为 \((f_{k}-f_{k-1})n!\) .

\(f_{k}\) 则是超立方体被超平面 \(\theta:\sum{c_i}=k\) 切割后的体积与原体积之比 (原体积就是 \(1\) ) .

事实上概率的本质也是如此, 符合条件的样本与样本空间之比, 即一个超立方体被一个或多个超平面切割后的体积.

这里给出二维平面的演示, 在 \(x,y\in[0,1]\) 的情况下有 \(x+y\) 在某个区间上的概率.

x3CD3R.png

红色即为符合要求的概率, 红色加绿色即为超立方体.

在此问题中, 超平面与坐标轴形成的体积即为 \(\frac{k^n}{n!}\) .

那符合条件的体积呢, 并不好算, 考虑容斥, 设 \(g_{x}\) 表示在超平面与坐标轴形成的 \(n\) 为图形中取一点, 点的坐标至少有 \(x\) 个维度大于等于 \(1\) (即不在超立方体上) 的概率.

\(x\) 维的取值在 \([1,k)\) 上, 钦定其减一变成 \([0,k-1)\) 对体积不造成影响 (这里不是指超立方体的体积, 而是超平面与坐标轴所构成的超立方体减去之前的超立方体所构成的体积) , 则总限制变成了 \(\sum{c_i}<k-x\) , 所以 \(g_{x}=\binom{n}{x}\frac{(k-x)^n}{n!}\) .

容斥之后即为 \(f_{k}=\sum\limits_{i=0}^{k-1}{(-1)^ig_i}\) . 时间复杂度 \(\mathcal{O}(n\log{n})\) .


\(\text{【LOJ\#6736】「2020 集训队论文」最小连通块}\)

\(\color{red}{\text{[HARD]}}\)

很有意思的题啊.

先考虑一个朴素算法, 我们询问 \(x\)\(V\setminus x\) , 可以知道 \(x\) 是不是叶子, 所以我们可以一层层剥叶子, 考虑怎么确定一个叶子的父亲, 在其上一层二分即可, 但这询问是 \(\mathcal{O}(dep\times n+n\log{n})\) 的.

考虑优化询问叶子, 我们可以通过二分集合并且询问 \(x\) 来得到 \(x\) 子树中的一个随机点, 这样找到一个叶子期望是 \(\log^2\) 的了.

现在我们来看看正解, 考虑我们有一个函数 \(f(x)\) , 调用之后可以求出整个 \(x\) 的结构. 我们按上面的方法找到 \(x\) 子树中的一个未被询问过的点 \(y\) , 然后调用 \(f(y)\) , 不断操作, 我们可以让 \(x\) 中所有点都至少调用过一次, 因此为确定关系的只有 \(x\) 和其儿子们.

由于我们也知道哪些点没确定父亲, 因此直接按之前所说二分即可, 总询问复杂度为 \(\mathcal{O}(n\log{n})\) .


\(\text{【LOJ\#2836】「JOISC 2018 Day 2」最差记者 3}\)

\(\color{green}{\text{[EASY]}}\)

很有意思的题啊, 首先很明显的事情是每个人走的方式一定是个周期, 那我们设 \(f_i\) 表示第 \(i\) 个人走之后会远离第 \(i+1\) 个人多远.

那么显然有 \(f_i=\lceil\frac{d_i}{f_{i-1}}\rceil f_{i-1}\) , 我们还在乎一个人走一次的时间周期, 不难发现这也是 \(f_i\) .

还有一件事是 \(f_i\)\(f_{i-1}\) 的倍数, 那么不同的 \(f\) 就只有 \(\mathcal{O}(\log{V})\) 个, 每次暴力求区间交即可, 时间复杂度 \(\mathcal{O}(n\log{V})\) .


\(\text{【LOJ\#2838】「JOISC 2018 Day 3」比太郎的聚会}\)

\(\color{green}{\text{[EASY]}}\)

这里借用一下别人的总结, 对于询问中某个量之和与 \(n\) 同阶的题目, 通常有 \(3\) 个做法,

  1. 如果是在树上, 可以考虑虚树.
  2. 如果这个量只有 \(\mathcal{O}(\sqrt{n})\) 种, 算过的保存下来就可以直接用.
  3. 根号分治.

这题考虑第三种即可, 对于大于 \(\sqrt{n}\) 个禁止点的询问考虑 \(\mathcal{O}(n)\)\(dp\) , 设 \(f_i\) 表示到点 \(i\) 最多经过多少点, 对于小于 \(\sqrt{n}\) 的询问, 暴力预处理出距离每个点前 \(\sqrt{n}\) 远的距离.

时间复杂度 \(\mathcal{O}(n\sqrt{n})\) .


\(\text{【LOJ\#2839】「JOISC 2018 Day 3」安全门}\)

\(\color{red}{\text{[HARD]}}\)

真困难, 这里阐述一下从 \(Alex\_ Wei\) 那得到的 \(xtx1092515503\) 的题解, 万分感谢两人. /qq

显然有 \(n\) 为奇数一定是无解的.

首先还是要解决判定问题, 记序列单侧合法为某一侧的前缀和始终不小于 \(0\) , 显然两侧合法则括号序列合法.

我们记前缀和为 \(S\) , 则反转区间 \((l,r]\) 后合法, 等价于如下条件,

\[\begin{cases} S_r-S_l=\frac{1}{2}S_n\\ \forall i\in [1,l] , S_l \geqslant 0\\ \forall i\in (r,n] , S_i \geqslant S_n\\ \forall i\in (l,r] , S_i \leqslant 2S_l \end{cases} \]

解释一下第一和第四个条件, 前者是因为令没反转的两段和为 \(a\) , 令反转前 \((l,r]\) 的和为 \(b\) , 有 \(a+b=S_n\)\(a-b=0\) 得来, 后者是因为需保证区间 \((l,r]\) 翻转后不会出现前缀和为负数的情况.

现在一个序列是好的, 可能有如下四种情况,

  1. 本身为合法序列.
  2. 前缀不合法后缀合法.
  3. 后缀不合法前缀合法.
  4. 前缀后缀均不合法.

对于第一种可以直接 \(\mathcal{O}(n^2)\)\(dp\) 解决, 令 \(f_{i,j}\) 表示考虑了前 \(i\) 个位置, 前缀和为 \(j\) 的方案数, 暴力转移即可.

考虑 \(2,3\) 的情况, 显然可以通过翻转并反转整个序列来相互转化, 故只考虑第二种情况, 前缀不合法后缀合法.

假设我们已经求出一个集合, 其中存储了所有满足且仅满足后缀合法前缀不合法的括号串, 则无论是集合中的哪个串, 反转了哪个区间此时必然满足条件 \(3\) , 即 \(\forall i\in (r,n],S_i \geqslant S_n\) .

考虑在 \(S\) 第一次降到负以前, 所达到的最大值为 \(a\) , 则我们必然可以贪心的令 \(l\) 取到满足 \(S_l=a\) 的某个位置.

简单证明一下.

对于第二条限制, 因为我们取的 \(l\) 一定满足 \(S\) 没有降到负数, 必然杯满足.

对于第四条限制, 显然是 \(S_l\) 越大越好.

考虑第一条限制, 因为后缀合法, 所以必然有 \(S_n \leqslant 0\) (不然后缀不可能合法) , 进而必有 \(S_r=S_l+\frac{1}{2}S_n \leqslant S_l\) , 又因为 \(S\) 是连续的, 所以 \(S_l\) 越大越可能找到好的 \(r\) .

\(S_n = b\) , 则 \(S_r = a+\frac{1}{2}b\) , 显然取最小的 \(r\) 更可能满足第四条限制, 我们以第一次变负的位置作为分界点, 则 \(l\) 必然在分界点之前, \(r\) 可能在分界点前或者后, 但我们可以根据 \(a+\frac{1}{2}b\) 的奇偶性来唯一得出 \(r\) 首次出现是在分界点前还是后.

因为 \(a\) 的权值会在枚举到分界点之后才被确定, 所以我们自然想到在分界点处统计答案.

\(f_{i,j,k}\) 表示前 \(i\) 位, 前缀和最大值为 \(j\) , 当前缀和为 \(k\) 的时方案数, 然后可以求出 \(F_{i,j}\) 表示 \(i\) 是分界点, 且 \(i\) 的最大前缀和为 \(j\) 的方案数.

分界点后的信息启发我们按后缀处理. 注意到因为 \(S_n=b\) , \(S_r=a+\frac{1}{2}b\) , 所以 \(r\) 处的后缀和应等于 \(a-\frac{1}{2}b\) , 于是我们枚举 \(i=a-\frac{1}{2}b\) , 设 \(g_{j,k,0/1}\) 表示后 \(j\sim n\) 位, 当前的后缀和为 \(k\) , 且是否有 \(j\leqslant r\) , 时的方案数.

只有当后缀和等于 \(i\) 时, 此时的 \(j\) 可以被拿来当作 \(r\) , 但是又因为仅有最小的 \(r\) 才是合法的, 故我们钦定最后一位为 \(1\) 的状态不能再次经过 \(k=i\) 的状态.

同时在最后一位为 \(1\) 的状态应该保证 \(S_j \leqslant 2a\) , 注意到满足 \(S_j \leqslant 2a\) 的状态等价于满足后缀和 \(\leqslant 2a-b\) 的状态, 而又有 \(2a-b=2(a-\frac{1}{2}b)=2i\) , 那么只需要钦定其在最后一位为 \(1\) 的状态中 \(k\) 不超过 \(2i\) 即可.

统计答案即为 \(\sum\limits_{a=0}^{i-1}{\sum\limits_{j=1}^{n}{F_{j,a}g_{j+1,2(i-a)-1,[2a-i<0]}}}\) .

这个式子的意义即为, 枚举 \(a\) , 枚举分界点 \(j\) , 在分界点处有 \(S_j=-1\) , 而有 \(S_n=b=2(i-a)\) , 于是得到 \(j+1\) 处的后缀和为 \(2(i-a)-1\) , \(2a-i=a+\frac{1}{2}b=S_r\) , 若 \(S_r<0\)\(S_r\) 的首次出现必然是在 \(j\) 后, 否则一定在 \(j\) 之前.

这个式子显然可以 \(\mathcal{O}(n^3)\) 解决.

现在考虑最后一种情况, 令 \(S\) 首次变成 \(-1\) 前的最大值为 \(a\) , 最后一次小于 \(S_n\) 后的最大值为 \(b\) , \(c=S_n\) .

显然首次变成 \(-1\) 的位置必然在最后一次小于 \(S_n\) 的位置之前, 这意味着我们得到了两个相对独立的问题.

  • \(a+\frac{1}{2}c \leqslant b\) , 则我们可以取 \(a\) 的位置为 \(l\) , 然后令最后一次小于 \(S_n\) 的位置后第一个 \(a+\frac{1}{2}c\) 的位置为 \(r\) , 然后和上面类似的 \(dp\) .
  • \(a+\frac{1}{2}c\geqslant b\) , 反转并翻转然后类似做即可.
  • \(a-\frac{1}{2}c=b\) 的情况要减去.

更详细的讲一下 \(a+\frac{1}{2}c\leqslant b\)\(dp\) , 首先 \(F_{i,j}\) 肯定可以照搬的, 我们仍把分界点定在第一次小于 \(0\) 的位置, 只不过后缀和的部分需要我们把最后一维扩展到 \(0/1/2\) , 其中 \(2\) 表示当前后缀和曾经下到 \(0\) 以下过, 进而 \(r\) 的位置已经确定了, 合并仍可和之前类似.

时间复杂度 \(\mathcal{O}(n^3)\) .


\(\text{【LOJ\#2840】「JOISC 2018 Day 4」糖}\)

\(\color{green}{\text{[EASY]}}\)

首先不难想到, 在没发生冲突的时候, 贪心选最大的一定最优, 那发生冲突的时候呢, 不难想到选了 \(i\) 之后 \(i-1\)\(i+1\) 就绑定在一起了, 要么都选要么都不选, 不难想到链表和堆来维护这个反悔贪心.

时间复杂度 \(\mathcal{O}(n\log{n})\) .


\(\text{【LOJ\#2841】「JOISC 2018 Day 4」图书馆}\)

\(\color{green}{\text{[EASY]}}\)

因为不区分从左往右和从右往左, 所以可以考虑从一边开始往另一个方向推, 考虑一个暴力, 我们可以先询问 \(\{1,2,\dots,n\}\setminus i\) 找到一个头, 然后 \(\mathcal{O}(n)\) 的询问其右边的位置, 这样总询问是 \(\mathcal{O}(n^2)\) 的.

考虑优化, 认为总体思想没有问题并且找到与一个位置相邻的询问肯定可以更优, 考虑二分, 令现在还没确定位置的数集合为 \(S\) , 将它们均匀的分为两个集合 \(A,B\) , 假设我们现在询问到了位置 \(p\) , 则询问 \(A\)\(A\cup \{p\}\) , 若值相等则相邻的位置在 \(A\) 中, 否则在 \(B\) 中.

询问复杂度为 \(\mathcal{O}(n\log{n})\) .


\(\text{【LOJ\#2842】「JOISC 2018 Day 4」野猪}\)

\(\color{blue}{\text{[NORMAL]}}\)

这里简述一下 \(hzy\) 的做法.

首先我们发现, 从 \(X_i\)\(X_{i+1}\) 的边只会有两种, 除了上一次走过来的边以外的最短路, 和最后一条边与该条边不同的次短路.

证明很显然, 如果走最短路不好那一定是因为挡了下次最短路的边.

但由于 \(X_i\) 会修改, 所以预处理与 \(X_i\) 有关的东西并没啥用, 我们考虑对于任意两个点, 我们应该知道些什么.

  1. 任意一条最短路.
  2. 与最短路最后一条边不同的最短路.
  3. 与最短路最后一条边不同且与第二条路径的第一条边不同的最短路.
  4. 与最短路第一条边不同的最短路.
  5. 与最短路第一条边不同且与第四条路径的最后一条边不同的最短路.

记录一条最短路我们只需要记第一条边最后一条边和长度即可描述.

进一步, 我们可以处理出 \(f_{i,j}\) 表示第一次经过第 \(i\) 条边, 最后一次经过第 \(j\) 条边的最短路长度 (无向边拆成有向边来做) , 总复杂度大概是 \(\mathcal{O}(m^2\log{m})\) .

接下来可以 \(dp\) , 设 \(g_{i,j}\) 表示走到 \(X_i\) 且上一次选择的是第 \(j\) 种路径, 不难得出转移式, 修改用线段树维护这个 \(dp\) , 即对每个区间维护一个 \(5\times 5\) 的矩阵, 表示 \(X_l\)\(X_{l+1}\)\(X_{r-1}\)\(X_{r}\) 分别用了什么路径, 合并枚举 \(X_{mid}\)\(X_{mid+1}\) 的路径即可.

时间复杂度 \(\mathcal{O}(m^2\log{m}+5^3T\log{l})\) .


\(\text{【PNOR\#3】数圈圈}\)

\(\color{green}{\text{[EASY]}}\)

仿照计算序列最大子段和的分治做法, 对矩形长的一条边分治, 计算跨过分界线的矩形个数, 答案枚举分界线上每对点 \(x,y\) 左右两边的半个矩形数量乘起来求和即可, 两边做法一致, 只讨论左边.

\(L_x\) 表示从点 \(x\) 开始往左, 相同字符最多能延申到第几列, 其中 \(x\) 是分界线上的点, \(D_{x,y}\) 表示 \((x,y)\) 往下, 相同字符最多能延申到第几行, 则我们要求的即为 \(\sum\limits_{i=\max\{L_x,L_y\}}^{mid}{[D_{i,x}\geqslant y]}\) , 当有 \(L_x\leqslant L_y\) 时,有 \(\sum\limits_{i=L_x}^{mid}{[D_{i,x}\geqslant y]}\) .

因为 \(L_x\) 是固定的, 所以可以用个桶存下所有 \(D_{i,x}\) , 做个后缀和后可 \(\mathcal{O}(1)\) 查询.

否则我们发现 \([D_{i,x}\geqslant y]\) 等价于 \([U_{i,y}\leqslant x]\) , 做法一致.

时间复杂度 \(\mathcal{O}(nm\log{nm})\) , 因为递归有 \(\log{nm}\) 层, 每层相当于枚举分界点上两个点, 不妨设 \(n<m\) , 所以有 \(n^2\leqslant nm\) .


\(\text{【UTR\#3】去月球}\)

\(\color{green}{\text{[EASY]}}\)

注意到无论什么操作序列进行消除, 最后得到的东西都是一样的, 因此我们可以从左往右扫, 维护一个栈, 当前的若与栈顶相同则弹出, 不同则加入, 最后栈中剩下的元素即为答案.

注意到, 我们所描述的这个结构, 和括号序列很像, 进一步的, 它确实可以描述成一个树形结构, 入栈相当于走儿子, 出栈相当于回溯, 类似 \(trie\) 树, 不难发现 \([1,n]\) 剩下的礼物个数即为最后一个结点的深度.

这棵树可以看成一棵无根树, 考察原序列的一个后缀 \([l,n]\) 即为把第 \(l\) 个礼物之前的结点当做新的根.

剩下的事就简单了, 找到第 \(l\) 个礼物之前的结点和第 \(r\) 个礼物之后的结点, 答案即为这两点的树上距离.

时间复杂度 \(\mathcal{O}(n\log{n}+q)\) .


感觉 \(JOISC\) 的题还蛮有意思的.

posted @ 2022-11-04 10:38  Lonely923  阅读(209)  评论(0编辑  收藏  举报