Skip to content

Latest commit

 

History

History
181 lines (107 loc) · 10.1 KB

michael-tikhomirov-contest-1.md

File metadata and controls

181 lines (107 loc) · 10.1 KB

Petrozavodsk Winter 2015. Day 9. Michael Tikhomirov Contest 1

A. Aarelia Mountains

题意:有 $n$ 个数 $h_1,h_2,\dots,h_n$。你想让这些数非递减,也就是对于任意 $i$,都有 $h_i \le h_{i+1}$。有 $m$ 个操作,第 $i$ 个操作可以选择一个长度为 $l_i$ 的区间,都加上 $t_i$,代价为 $c_i$。最后每个数可以是负数,求出最小代价。

$1 \le n, m \le 200, 0 \le h_i \le 10^6, 1 \le c_i \le 10^6, 1 \le l_i \le n, t_i \in {-1, 1}$

题解:令 $a_i=h_i-h_{i-1}$,显然一个长度为 $l$ 的操作,就是把某个 $a_i$ 减去 $t$,$a_{i+l}$ 加上 $t$。显然,是从正的 $a_i$ 到某个负的 $a_j$ 比较优。

于是可以建立费用流模型,源点到所有正的 $a_i$ 连边,所有负的 $a_j$ 到汇点连边。如果负的 $a_j$ 满流的话就是有解,否则无解。

B. Bar "Duck"

题意:长度为 $L$ 的线段,上面有 $n$ 个障碍物,第 $i$ 个在 $x_i$,质量为 $m_i$。你可以给第 $i$ 个障碍物一个初始速度 $v_i$,然后选择匀速往左或者往右,消耗能量为 $\frac{m_iv_i^2}{2}$

问在 $T$ 时间内,总能量不超过 $E$ 的情况下,最长的无障碍物子段的长度。

$1 \le n \le 10^5, 1 \le L, T, E \le 10^6, 0 < x_i < L, 1 \le m_i \le 10^3$

题解:二分答案 $d$,考虑如何判定。假设这个没有障碍物的区间左端点是 $z$,那么在区间 $[z, z+\frac{d}{2}]$ 里的障碍物显然都要往左走,在区间 $[z+\frac{d}{2}, z+d]$ 里的障碍物都要往右走。

可以发现 $z$ 的关键点有 $x_i$,$x_i-\frac{d}{2}$ 和 $x_i-d$。把关键点拿出来排序,那么如果 $z$ 在相邻两个关键点对应的区间里,$[z, z+\frac{d}{2}]$ 和 $[z+\frac{d}{2}, z+d]$ 里的障碍物集合是一样的。

于是对于每个这样的区间,都可以列出一个一元二次方程,求一下最值即可。

关键点可以通过归并的方式合并,这样就可以做到线性判定。

C. Collections In Containers

题意:给你一个 $n$$d$ 维的向量集合,满足,如果存在向量 $a_1, a_2, ..., a_d$,那么对于任意 $b$,满足 $0 \leq b_i \leq a_i$ 都存在。

给出一个长度为 $n$ 的数组 $c_1,c_2,\dots,c_n$。你需要找到一个长度为 $n$ 的排列 $p$$q$,使得 $a_{p_i,j} + a_{q_i,j} \le c_j$

$1 \le nd \le 10^5, 0 \le c_i \le 10^9, 0 \le v_{i,j} \le c_j$

题解:题目给定的 $c$ 其实没有多大用处,因为我们总是可以构造出一个 $c_j = \max_i(a_{i,j})$ 时候的解。

可以发现,题目给出的限制很强,我们任意去掉一维后这个性质还是满足的。其实题目给出的限制就是说集合是一个凸集。

考虑按照维数递归构造答案,假设我们需要构造满足前 $k$ 维的答案。把所有向量按照第 $k$ 维归类,值一样的归为同一类。那么对于同一类,我们可以递归搞出一个符合前 $k-1$ 维的解。接下来考虑如果使得第 $k$ 维也满足条件。

假设第 $k$ 维的最大值为 $m_k$,那么对于 $2 a_{i,k} \le m_k$ 的,肯定是满足条件的,因此我们需要调整 $2 a_{i,k} > m_k$ 的。对于这种 $a_{i,k}$,肯定存在另一个 $a_{j,k}=m_k-a_{i,k}$,使得 $a_{i,1..k-1} = a_{j,1..k-1}$。只需要交换它俩的匹配就可以使 $a_{i,k}$ 满足条件。

对于一个 $i$ 求出对应的 $j$ 的话,可以使用字符串 hash 来加速判定。

D. 1D Spreadsheet

题意:有 $n$ 个格子,一开始第 $i$ 个格子包含一个数 $a_i$。有 $q$ 个操作,

  • 令格子 $i$ 包含数 $x$
  • 令格子 $i$ 指向格子 $j$
  • 求出格子 $l$ 到格子 $r$ 的权值和

如果一个格子包含一个数,那么这个格子的权值为这个数;否则这个格子的权值为它指向的格子的权值。保证不会出现循环指向。

$1 \le n, q \le 2 \times 10^5, -10^4 \le a_i, x \le 10^4, 1 \le i, j \le n, 1 \le l \le r \le n$

题解:考虑把操作分块,每 $L$ 次操作重建格子的指向关系和权值。对于一个询问操作,我们只需要关心最近的 $O(L)$ 个修改操作。

把这些操作涉及到的格子拿出来,记为关键点。那么我们可以先基于未修改的权值,求出一个答案来。由于这些关键点都被修改过了,那么需要减去这些关键点对答案的贡献,就是对应子树里面有多少节点在区间 $[l, r]$ 里。同时我们也可以在 $O(L)$ 时间处理出,这 $O(L)$ 个关键点现在的权值是多少。把新的权值乘上子树里面合法节点个数加回贡献即可。

$L = \sqrt{n \log n}$ 的话,复杂度是 $O(n \sqrt{n \log n})$

E. Even Separation

题意:给出 $n$ 个点 $m$ 条边的无向图。你需要把点分成两组,使得删掉连接不同组的边之后,每个点的度数都是偶数。

$1 \le n \le 500, 0 \le m \le \frac{n(n-1)}{2}$

题解:考虑用 $x_i=0/1$ 表示每个点属于哪个组,$deg_i$ 表示第 $i$ 个点当前的度数。可以发现,

  • 如果 $deg_i$ 是偶数,那么 $\sum_{j \in N(i)} x_j \equiv 0 \pmod 2$
  • 如果 $deg_i$ 是奇数,那么有 $\sum_{j \in N(i)} x_j \equiv \overline{x_i} \pmod 2$,即 $x_i + \sum_{j \in N(i)} x_j \equiv 1 \pmod 2$

于是,我们得到了一个异或方程组,高斯消元解一下就好了。

F. Fibonacci's Nightmare

题意:考虑这样一个随机序列:$a_0 = 1$,$a_n$ 是随机选出来的 $a_i$$a_j$ ($0 \le i, j \le n - 1$)的和。

你需要求出 $a_n$ 的方差。

$0 \le n \le 10^6$

题解:考虑方差的公式 $Var(X)=E(X^2) - E^2(X)$,我们仅需要求出 $a^2_n$$a_n$ 的期望值。

先考虑 $a_n$ 的期望值,根据期望的线性性,显然有

$$ E(a_n) = \frac{\sum\limits_{i=0}^{n-1}\sum\limits_{j=0}^{n-1} E(a_i)+E(a_j)}{n^2}=\frac{2\sum\limits_{i=0}^{n-1}E(a_i)}{n} $$

最终其实可以发现,$E(a_n)=n+1$。

接下来考虑 $E(a^2_n)$,显然有

$$ \begin{aligned} E(a^2_n) &=& \frac{\sum\limits_{i=0}^{n-1}\sum\limits_{j=0}^{n-1} E((a_i+a_j)^2)}{n^2} \\ &=& \frac{\sum\limits_{i=0}^{n-1}\sum\limits_{j=0}^{n-1} E(a_i^2+a_j^2+2a_ia_j)}{n^2} \\ &=& \frac{2 \sum\limits_{i=0}^{n-1}E(a_i^2)}{n}+\frac{2E((\sum\limits_{i=0}^{n-1}a_i))^2}{n^2} \end{aligned} $$

我们需要求出 $E((\sum\limits_{i=0}^{n}a_i)^2)$,可以拆成 $(a_n+\sum\limits_{i=0}^{n-1}a_i)^2$,化简下得到

$$ E((\sum\limits_{i=0}^{n}a_i)^2)=E(a_n^2)+E((\sum\limits_{i=0}^{n-1}a_i)^2)+E(a_n(\sum_{i=0}^{n-1}a_i)) $$

继续把 $a_n$ 拆掉的话,最终可以得到

$$ E((\sum\limits_{i=0}^{n}a_i)^2)=E(a_n^2)+\frac{(4+n)\cdot E((\sum_{i=0}^{n-1}a_i)^2)}{n} $$

递推就可以算出答案了。

G. Guess The String

题意:交互题。有一个长度不超过 $500$ 的字符串 $s$,仅有小写字母组成。每次你可以询问一个串 $t$ 是不是 $s$ 的子序列。所有询问中 $t$ 的总长不能超过 $6 \cdot 10^5$

题解:先问出每个字符出现的次数,然后每次拿出两个最短的字符串合并。假设当前是 $z$,还剩 $x$$y$ 没有合并,就查一查 $z+x[0]+y$ 或者 $z+y[0]+x$ 是不是子序列就可以确定下一个字符是 $x[0]$ 还是 $y[0]$

H. Hilbert's Maze

题意:给出一个 $k$ 阶的 Hilbert's Maze,一个起点 $(x_s,y_s)$ 和终点 $(x_t, y_t)$。求出起点到终点的最短路。

$0 \le k \le 30, 1 \le x_s, y_s, x_t, y_t \le 2^{k+1}-1$

题解:对于每个点,我们先构造出一条从 $T_0$ 怎么演变到 $T_k$ 的路径。这条路径只需要记录:当前从这四条边的哪个位置出来以及到这个位置经过了多少距离。

对于两条这样的路径,我们可以找到他们的公共前缀,从这个位置开始,距离就可以独立计算了。因此,我们仅需要计算在这个公共前缀处,我们从一个点到另一个点的距离。

这个基本上可以分成三部分:外面正方形的轮廓线;上面的 $1 \times 2^k$ 的小区域;下面的 $T$ 型区域。对于后两者,我们最终都是要走到外轮廓的,除非两个点属于同一个区域。

I. Infinite Binary Embedding

题意:给定一棵 $n$ 个节点的满二叉树 $T$ 和一棵无穷满二叉树 $I$。问有多少个从 $T$ 的结点到 $I$ 的结点的单射 $f$, 使得

  • $v$$T$ 中的叶子,则 $f(v)$$I$ 中的深度为 $h_v$
  • $v$$T$$u$ 的左孩子,则 $f(v)$$I$ 中是以 $f(u)$ 的左孩子为根的子树中的一个结点
  • $v$$T$$u$ 的右孩子,则 $f(v)$$I$ 中是以 $f(u)$ 的右孩子为根的子树中的一个结点

$1 \le n \le 2000, 0 \le h_v \le 10^9$

题解:令 $dp(v, x)$ 表示 $T$ 中以 $v$ 为根的子树,$f(v)$ 在 $I$ 中深度至少为 $x$ 的方案数。显然,我们就是要求出 $dp(1, 0)$

可以发现,$f(v)$ 在 $I$ 的哪个深度为 $h_v$ 的位置上并不重要,因为所有子树都是对称的。考虑如下的递推式

$$ dp(v, x) = \begin{cases} 2^{h_v} & v \text{ is leaf }, x \le h_v \\ \sum_{x \le y \le h_v}\frac{dp(lson(v), y+1)}{2^{y+1}} \cdot \frac{dp(rson(v), y+1)}{2^{y+1}} \cdot 2^y & \text{otherwise} \end{cases} $$

可以发现,如果我们令 $dp(v, x) = \sum_{i} a_i \cdot 2^{ix}$,那么我们就可以很方便的维护上面的转移式子。

对于一个 $v$,最大的 $i$,使得 $a_i$ 非零,只和 $v$ 的子树大小有关。因此可以在 $O(n^2)$ 做好转移。

J. Jitterbug

题意:给出 $n$$b$,构造一个 $n$ 个点的图,使得从 $1$$n$ 的期望步数是 $b$

$n = 200, b = 10^6$

题解:先构造 $100$ 个点的团,然后构造 $100$ 个点的链,接上即可。