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\) :
- \(x < c_i\),没有影响。
- \(c_i \le x \le c_i + l_i - 1\),会变到 \([a_i, b_i]\) 中相应的位置。
- \(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]\) 满足全是 J
或 O
或 I
至少要多少次操作,转移显然,注意空间可能不够,需要滚动数组优化。
可能也不算 DP,但确实是一种转移。
#2996. 「JOISC 2015 Day1」有趣的家庭菜园 2
首先从前往后考虑,在当前情况下,记 \(cost_i\) 表示保证高度为 \(i\) 的 IOI 草能够存活下所获得的最大贡献,同时记 \(f_i\) 表示 \(i\) 位置的 IOI 草能够存活的最大贡献,然后每次有这样几种转移:
- \(f_i = \max\limits_{j = 1}^{H_i}\left\{cost_j\right\} + P_i\)
- \(\forall j \in [1, H_i - 1], cost_j \gets cost_j - C_i\) (必须拔了 \(i\) 号 IOI 草才能存活)
- \(cost_j = \max(cost_j, f_i)\)
然后题目的条件是或,也就是只要有一边满足条件就行了,那么再倒着搞一遍算出 \(g_i\),然后
减去 \(P_i\) 是因为贡献被算了两遍。
#2997. 「JOISC 2015 Day 1」卡片占卜
感觉这个转为最短路好高级啊。
首先将区间翻转变为 差分后的两个单点取反,我们最后的目标就是整个差分数组为 \(0\)。
然后就有一个非常高级的操作:
如果我们选择翻转 \((x, y - 1), (y, z)\),那么在差分数组上就是 \(x - 1, y - 1, y - 1, z\) 取反,也就是 \(x - 1, z\) 取反了。
感觉上面的是废话
然后有几种情况:
- \(B, D\) 翻转
- \(BC, CD\) 翻转
- \(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\),那么有:
- \(x, y\) 都出去,如果 \(x\) 有钥匙,那么大门就可以关上。
- \(x\) 出去,\(y\) 进来,如果 \(x, y\) 都有钥匙,那么大门就可以关上。
- \(x\) 进来,\(y\) 出去,大门必定关上。
- \(x, y\) 都进来,如果 \(y\) 有钥匙,那么大门可以关上。
我们发现只有 情况 2 是要依赖前面人的情况的,那么可以连一条边 \((x, y)\), 最后图将由若干条链组成,最后的问题就是:
- \(x\) 如果有钥匙,那么就有 \(t_x\) 的贡献。
- \(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」防壁
不会,正在咕咕咕咕。