JOI Final 合集
2015
C \(\color{gary}\bigstar\)
傻逼题。
D \(\color{Gold}\bigstar\)
显然需要二分答案,然后不会了。
操作是固定的,建出操作树,然后在上面 dp 即可。
E \(\color{green}\bigstar\)
左上角,右下角,有一个贡献,数据结构瞎维护就行。
2016
C \(\color{green}\bigstar\)
最短路径 dag 搞出来,找割边。
D\(\color{green}\bigstar\)
和 这题 差不多,懒得写了。
E \(\color{blue}\bigstar\)
倒过来,最后地表的点向下移动。
然后发现每个操作一定是修改一个前缀或者一个后缀,用三颗线段数维护值,左边和右边能影响到这个点的值。
2017
C \(\color{green}\bigstar\)
首先最大值和最小值显然要放在两个块里,不然一定不优。
二分答案,然后对于每一行,肯定是前面和后面分开,瞎判一下就好了。
D \(\color{green}\bigstar\)
直接建图,一个点表示这个点是人带着球,然后踢出或者运球,踢出去之后,在目标位置找最近的一个人过来接。
直接暴力就是 \(O(H^3)\),学习了一下 \(O(m+n\log n)\) 的 dij。
也可以优化一下,踢出的球要么横着,要么竖着,因此拆成三个点即可。
E \(\color{blue}\bigstar\)
考虑倒过来,最后是两个点,去扩展,相当于选一段复制一下。
瞎证明一下会发现出了两端的两个点,其他连续段长度一定是偶数,并且所有满足这个条件的都可以凑出。
然后考虑相邻两个的贡献就没了。
2018
C \(\color{green}\bigstar\)
按绿色点确定,然后发现只有在一条斜线上的会互相影响,然后每一斜上 dp 即可。
D \(\color{blue}\bigstar\)
先对四个点去跑最短路。
然后显然是在 \(S\) 到 \(T\) 的最短路 Dag 上找一个点连 \(U\),另一个连 \(T\),那么只需要在后继上找个最小值即可。
E \(\color{blue}\bigstar\)
好题,想很久。
可以发现有若干个暴力,比如枚举每个 ?
。
那么再想几个暴力然后合并一下。
考虑如果只有 ?0
咋做。
预处理一下即可,相当于子集加。
然后如果有 1
,容斥一下,把 1
变成 0?
,然后做就行了。
拆成三个部分,复杂度 \(O(Q2^{L/3}+L2^L)\)。
2021
C \(\color{green}\bigstar\)
最后的序列一定是若干个下降区间,每个下降区间的值域连续。
交换次数又满足每次把东西扔最前面是最小的。
因此直接 dp,每次枚举一个前缀放到最前面然后计算需要交换的次数即可。
D \(\color{green}\bigstar\)
暴力建图,没啥意思。
E \(\color{blue}\bigstar\)
先 \(U_i\) 排序。
考虑到每个地方,如果补满之后可以到达一个比自己便宜的地方,那么肯定恰好到那个地方,否则补满。
那么建一颗树,表示每个点会去那个地方,注意到修改次数是 \(O(n)\) 的。
弹飞绵羊,就可以 \(O(n\sqrt{n})\) 了。
2022
C \(\color{Gold}\bigstar\)
去年不会做。
考虑最后肯定是 \(B_i\) 排序,然后选一些,然后再选 \(A_i\)。
注意到一个性质,那些选 \(B_i\) 的前面,肯定都是选了的,不可能空着,不然可以换。
暴力 dp 就是 \(O(n^3)\) 了。
D \(\color{green}\bigstar\)
倍增,维护左右到的地方即可。
E \(\color{Gold}\bigstar\)
把一个子矩形扣出来,那么对于每个点,在周围一圈找比自己大的最小的和比自己小的最大的,肯定一个入边一个出边。
如果可以全部连起来,那么肯定合法。
那么考虑每个点的度数都是 \(2\),简单的想法是对于每条边令权值为大的减去小的,那么全部加起来一定是最大值减去最小值。
最大值不好搞,直接如果没有比自己大的就把这头的值变成 Inf。
这样每个点都有自己的权值,相当于一个二位前缀和。
横竖取个 \(\min\),然后做,复杂度 \(nm\sqrt{nm}\log n\)。
2023
C \(\color{Gold}\bigstar\)
直接 bfs,但是每个点的更新范围是一个正方形。
此时一个很妙的是,起点暴力更新一个正方形,然后每个点只需要更新最外面一圈即可。
也有一个比较容易想的做法,先横着更新,然后竖着。
D \(\color{green}\bigstar\)
简单题,一个点会到比自己小的点上,但是不能经过比自己大的,因此直接从小到大加点即可。
E \(\color{Gold}\bigstar\)
每个东西的贡献就是把一个前缀变成 R
或者后缀变成 B
。
首先通过 \(O(n)\) 次操作,就可以把序列变成前缀是 R
,后面全都是 B
的结构。
然后再去分讨操作对这个中间分界线的影响。
代码还没写,先咕。