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 的结构。

然后再去分讨操作对这个中间分界线的影响。

代码还没写,先咕。

posted @ 2023-08-14 14:01  houzhiyuan  阅读(33)  评论(0编辑  收藏  举报