9.18CF1817题解

发布时间 2023-09-19 19:11:34作者: He_Zi

9.18CF1817题解

A. Almost Increasing Subsequence

题意

给定长度为 \(n\) 一个序列 \(a\) 以及 \(q\) 次询问,每次询问给出 \(l\)\(r\),找出序列 \(a\)\([l,r]\) 内最长的几乎递增子序列。

对于几乎递增的定义:如果一个序列中不存在连续的三个数 \(x\)\(y\)\(z\),使得 \(x \ge y \ge \ z\),则这个序列是几乎递增的。

题解

直接找出区间内 \(a_{i-1} \le a_i\le a_{i + 1}\) 个数,区间长度减去这个的个数。

因为连续3个只能选择两个。

前缀和记录一下就可以。

B. Fish Graph

题意

定义“鱼图”为满足以下条件的无向图:

  • 该图包含正好 \(1\) 个环,环上有 \(1\) 个特殊的结点 \(u\)\(u\) 除了连在环上的 \(2\) 条边外还有正好 \(2\) 条边,每一条边连向一个环外的结点(即,若环的大小为 \(s\),整个图一共有 \(s+2\) 个结点)。

现在给定一个简单无向图,问该图中是否有一个子图为“鱼图”。一个无向图的子图即为原图中删去若干个点和若干条边所形成的图。如果存在,还需要构造出其中任意一个满足要求的子图。

题解

找环小技巧:

枚举一个点 \(s\)bfs,记录 \(fa_i\)\(fa_i\) 里面全是 \(s\) 相邻的点,表示 \(i\) 被搜索到是从 \(fa_i\) 这个 \(s\) 的邻居搜到的。

若有边 \((u,v)\) 并且 \(fa_u \ne fa_v\) 那么就可以形成一个环。

所以枚举度 \(\ge 4\) 的点暴力找环就完了。

C. Similar Polynomials

题意

给定两个次数为 \(d\) 的多项式 \(A, B\)\(0, 1, 2, \dots, d\) 处的点值对 \(10^9+7\) 取模,保证 \(B(x) \equiv A(x+s) \pmod {10^9+7}\)。求 \(s \bmod 10^9+7\)

题解

多项式差分

定义差分运算 \(\Delta\)

\[\Delta h_i = h_{i + 1} - h_i \]

定义 k 阶差分:

\[\Delta^k h_i = \Delta(\Delta^{k-1}h_{i})=\Delta^{k-1} h_{i + 1} - \Delta^{k-1} h_{i} \]

我们发现连续点值差分一次就会消掉一项,消到只剩两项就是 \(ax+b\),一项就是 \(-a\)

然后两个多项式都求一次,就是已知 \(a,ax+b,a(x+s)+b\)\(s\),这很简单。

D. Toy Machine

题意

有一个长 \(n\)\(2\) 的矩形游戏机。保证 \(n\) 是奇数。

游戏开始之前,有 \(n - 2\) 个玩具放在第一排中间的 \(n - 2\) 个位置中(两个角除外)。编号从左到右依次为 \(1\)\(n - 2\)。第二行为空,其最左、最右和中心位置是障碍物。你可以控制玩具机向左、向右、向上、向下,分别用字母 \(\texttt L\)\(\texttt R\)\(\texttt U\)\(\texttt D\) 表示。

操控时,所有玩具将同时沿相应方向移动,碰到另一个玩具、墙壁或障碍物停止。您的目标是将第 \(k\) 个玩具移动到第一行最左边。给定 \(n\)\(k\),构造一个最多使用 \(1000000\) 次操作的方案。

题解

如果 \(k\) 在左边,直接 \(\texttt {LURD}\) 一直循环即可。

如果 \(k\) 在中间,直接 \(\texttt {DR}\)

如果 \(k\) 在右边,比较难搞。

  • 我们先考虑 \(k = n - 2\)\(k\) 在最后的情况,直接循环 \(\texttt{LULD}\),最后形成如同图一的情况,直接 \(\texttt{RDL}\)

  • 对于平凡的情况我们考虑通过循环 \(\texttt{RULD}\) 把这个点移动到最后位,然后通过上面的方法做。

图一
(图一)

E. Half-sum

题意

有一个非负整数序列 \(\{a_1,a_2,\dots,a_n\}\)

你可以从序列中取任意两个数,并将它们的平均数放回序列。

序列最后会剩两个数,请求出这两个数的差的绝对值的最大值。

因为答案将会是一个小数,所以请输出答案对 \(10^9+7\) 取模的结果。

题解

最优情况应该是:

先排序,找一个断点,左边从右向左依次操作,右边从左向右依次操作。

左边就是 \(A\),右边就是 \(B\)

如果直接找断点是 \(O(n^2)\) 的,我们考虑找前 \(32\) 个和后 \(32\) 个。

因为超过 \(32\) 的必定要除以 \(2^{32}\) ,数据范围 \(2^{31}\) ,除之后必定 \(<1\) 贡献太小了,不需要考虑。(这是感性理解)