JOISC 2015 简要题解

目前还在咕咕咕咕的题目:#3001. 「JOISC 2015 Day 3」AAQQZ,#3006. 「JOISC 2015 Day 4」防壁

#2994. 「JOISC 2015 Day1」复制粘贴 2

考虑时间倒流,维护每个位置是从哪里来的,那么对于第 \(i\) 次插入,设 \(l_i = b_i - a_i + 1\), 对于位置 \(x\) :

  1. \(x < c_i\),没有影响。
  2. \(c_i \le x \le c_i + l_i - 1\),会变到 \([a_i, b_i]\) 中相应的位置。
  3. \(x > ci + l_i - 1\), 往前挪 \(l_i\) 。

复杂度为 \(\mathcal O(KN)\)

#2995. 「JOISC 2015 Day1」愉快的标志设计

声明:因为是环,对于 \([l, r]\) 这种表示形式,如果 \(r > n\) ,那么该区间代表 \([l, n] \vee [1, r \bmod n + 1]\) 。

维护几个 \(dp\) 数组,\(F_{k, i}\) 表示 \([i, i + 4^k - 1]\) 要满足条件至少要几次操作,\(J_{k, i}, O_{k, i}, I_{k, i}\) 分别代表使得 \([i, i + 4^k]\) 满足全是 JOI 至少要多少次操作,转移显然,注意空间可能不够,需要滚动数组优化。

可能也不算 DP,但确实是一种转移。

#2996. 「JOISC 2015 Day1」有趣的家庭菜园 2

首先从前往后考虑,在当前情况下,记 \(cost_i\) 表示保证高度为 \(i\) 的 IOI 草能够存活下所获得的最大贡献,同时记 \(f_i\) 表示 \(i\) 位置的 IOI 草能够存活的最大贡献,然后每次有这样几种转移:

  1. \(f_i = \max\limits_{j = 1}^{H_i}\left\{cost_j\right\} + P_i\)
  2. $\forall j \in [1, H_i - 1], cost_j \gets cost_j - C_i $ (必须拔了 \(i\) 号 IOI 草才能存活)
  3. \(cost_j = \max(cost_j, f_i)\)

然后题目的条件是,也就是只要有 一边满足条件就行了,那么再倒着搞一遍算出 \(g_i\),然后

\[ans = \max\left\{f_i + g_i - P_i\right\} \]

减去 \(P_i\) 是因为贡献被算了两遍。

#2997. 「JOISC 2015 Day 1」卡片占卜

感觉这个转为最短路好高级啊。

首先将区间翻转变为 差分后的两个单点取反,我们最后的目标就是整个差分数组为 \(0\)。

然后就有一个非常高级的操作:

如果我们选择翻转 \((x, y - 1), (y, z)\),那么在差分数组上就是 \(x - 1, y - 1, y - 1, z\) 取反,也就是 \(x - 1, z\) 取反了。

感觉上面的是废话

然后有几种情况:

  1. \(B, D\) 翻转
  2. \(BC, CD\) 翻转
  3. \(BD, C\) 翻转

都可以用最短路的形式表示出来,跑一跑就行了。

#2998. 「JOISC 2015 Day2」Building 3

考虑 check A 序列是否合法。

如果对于每个 \(A_i\), 存在一个 \(j < i, A_j + 1= A_i\) ,那么就 ok 了。

可以记一个前缀 \(mx\), 如果 \(t = \displaystyle \sum_{i = 2}^n \max(mx_i - mx_{i - 1} - 1, 0) > 1\) 那么显然无解。

对于 \(t = 0, t = 1\) 的情况,讨论一下在哪里插入就行了。

#2999. 「JOISC 2015 Day2」Keys

每个时间点都不同,极大程度上方便了情况的讨论。

考虑对于每个时间段分开讨论,对于时间段 \([i, i + 1]\),我们可以定位到对应的几个员工上,设 \(i\) 时间为员工 \(x\),\(i + 1\) 时间为员工 \(y\),那么有:

  1. \(x, y\) 都出去,如果 \(x\) 有钥匙,那么大门就可以关上。
  2. \(x\) 出去,\(y\) 进来,如果 \(x, y\) 都有钥匙,那么大门就可以关上。
  3. \(x\) 进来,\(y\) 出去,大门必定关上。
  4. \(x, y\) 都进来,如果 \(y\) 有钥匙,那么大门可以关上。

我们发现只有 情况 2 是要依赖前面人的情况的,那么可以连一条边 \((x, y)\), 最后图将由若干条链组成,最后的问题就是:

  1. \(x\) 如果有钥匙,那么就有 \(t_x\) 的贡献。
  2. \(x\) 和前面的人都有钥匙,那么就有 \(v_x\) 的贡献。

因此设 \(f_{x, k, 0 / 1}\) 表示考虑到第 \(x\) 人,共分配了 \(k\) 把钥匙,\(x\) 是否有钥匙的贡献最大值就行了。

#3000. 「JOISC 2015 Day2」Road Development

树剖板子,不解释。

#3001. 「JOISC 2015 Day 3」AAQQZ

不会,正在咕咕咕咕。

#3002. 「JOISC 2015 Day 3」Card Game Is Great Fun

痛苦的回忆,不太想写。

当初考试用爆搜 + 卡时过了,但是 \(\mathcal O(\frac{n^3}{w})\) 正解写得要死。

贴个链接,正在咕咕咕咕。

#3004. 「JOISC 2015 Day 4」Inheritance

维护 \(K\) 个并查集,边权从大到小对于每条边去二分第一个两点不连通的并查集,然后加边就行了。

#3005. 「JOISC 2015 Day 4」Limited Memory

考虑将 <[ 视为 (,即为 +1,将 >] 视为 ),记为 -1, 然后前缀和 \(s\), 就可以 check 了,如果这样都配不上不行,那么就不行了。

接下来就是考虑判断每次配对的两个是不是同种型号。

注意到允许的询问次数比 \(\mathcal O(n ^ 2)\) 还多,那么我们可以考虑分层 check,每次 对于 \(s = dep\) 时,check两个字符是否配对,这样只需要记录:

最后一个 \(s = dep\) 时的型号 ( \(0 \sim 1\) ) ,当前 \(pos(0 \sim n)\),前缀和 \(s (0 \sim n)\),当前要 check 的 \(dep(1 \sim n)\),共 \(1 + 7 + 7 + 7 = 22\) 个二进制位,刚好用完。

有个玄学问题,压位的时候不同的方式会直接导致 WA,调了不知道多久,甚至现在没有发现问题。

#3006. 「JOISC 2015 Day 4」防壁

不会,正在咕咕咕咕。

上一篇:【PLA】基于Python实现的线性代数算法库之QR分解


下一篇:「JOISC 2012」星座(凸包)