JOI记录
JOI 2019 Final
半夜睡不着啊……来写写
「JOI 2019 Final」勇者比太郎
统计 O 在哪里即可,做两个前缀和。
「JOI 2019 Final」画展
显然对于一组确定的方案,画框是取前 \(k\) 大的,这启发我们从大到小贪心。
考虑当前在第 \(i\) 个画框,记上一个选的画价值为 \(x\),为了满足条件应该找到不大于 \(x\) 的最大值并删掉,用 set 维护即可。
但是这样会喜提 0pts,原因是如果有多个画的价值相同应该取大小最大的删去,这样保证 set 维护时不会删掉前面。
「JOI 2019 Final」有趣的家庭菜园 3
思考一下最后的答案形态,一个显然且重要的结论是同种颜色内部相对顺序不变。
这启发我们按照序列顺序 dp,具体的设 \(f_{i,j,k,0/1/2/3}\) 表示选了 \(i\) 个 \(0\),\(j\) 个 \(1\),\(k\) 个 \(2\),结尾是 \(0/1/2\) 的最小代价,考虑从哪里转移来,以 \(0\) 举例:枚举上一个是 \(1\) 还是 \(2\),从 \(f_{i-1,j,k,1}\) 和 \(f_{i-1,j,k,2}\) 转移而来。
问题在于转移代价如何计算,即第 \(i\) 个 \(0\) 应该移动多少。
假设原序列种第 \(i\) 个 \(0\) 在 \(x\) 上,如果 \(x\) 前面的 \(1\) 足够了,即不小于 \(j\),那么就不需考虑 \(j\),否则需要将一些 \(j\) 移动到 \(x\) 前,代价即为 \(j - cnt_j\),对于 \(2\) 也是一样,这样贡献就可以快速算了。
复杂度 \(O(n^3)\)。
「JOI 2019 Final」硬币收藏
可以看成给每个硬币分配一个位置,然后每个硬币走到位置上的最小路径和。
先让每个硬币走进 \(2*n\) 的连通块内,容易找到每个硬币所对应的连通块的进入点,具体地,行列独立开来,分类讨论一下与 \(1,n\) 的大小关系即可。
找到了后问题变成了 \(2*n\) 的网络中每个格子有 \(w(i,j)\) 枚棋子,移动至每个格子仅有一枚棋子的最小代价。
实际上就是个有二维的均分纸牌问题,不同的是可以上下交换,而能上下交换一定是更优的,根据符号讨论即可。
复杂度 \(O(n)\)。
「JOI 2019 Final」独特的城市
要求的是对于每个点为根时,距离它相同的点数只有 \(1\) 的集合并大小。
考虑每个点出发的最长链,能贡献的点一定在最长链上,而每个点出发的最长链至少有一个在树的直径上,故以直径为起始点考虑,最后取 \(\max\) 即可。
对于一个点 \(u\),需要维护他到根路径上能产生贡献的点,我们 dfs 一遍整棵树,从节点 \(u\) 进入节点 \(v\) 时,唯一的变化是计算点 \(u\) 不在 \(v\) 内的最长链 \(l\),然后将距离点 \(u\) 小于等于 \(l\) 的贡献点删掉。
求最长链和次长链可以类似长链剖分,维护时拿一个栈即可。
JOI Open 2019
「JOI Open 2019」三级跳
山东三轮省集题,核心在于支配对。
考虑 \(a,b\) 取值,若 \(a = w_i, b = w_j\),且 \(\exist k \in [i,j],w_k \ge \max(w_i, w_j)\),则取 \(i,k\) 或 \(k,j\) 一定优于 \(i,j\)。
有用的 \(a,b\) 数量只有 \(O(n)\),离线扫左端点线段树维护 \(c\) 取值即可。
「JOI Open 2019」汇款
一开始没看懂题……交的税得跟往下传的一样
第一想法是能移就移,不难发现贪心是挺对的,因为不管怎么移动花费始终相等。
然后暴力做就很对,因为每次 \(d_i = a_i - b_i\) 至少除二,\(\log\) 轮就取完了。
最后特判一点特殊情况,全部 \(a_i = b_i\) 和全部 \(a_i = b_i+1\),且存在 \(a_i \ge 2\)。
「JOI Open 2019」病毒实验
很精妙的题,甚至可以当作模板:有向图特殊性质的多点 bfs 扩展。
首先风向的限制可以简单处理出来,注意到一个点只跟它四联通方向是否被访问有关,于是预处理 \(2^4\) 种状态表示在该状态下最长的连续段是多少即可做到 \(O(1)\) 扩展一个点。
然后就有 \(O((nm)^2)\) 的暴力了,我们希望减少 bfs 次数。
注意到一个性质:若能从 \(u\) 扩展到 \(v\),则 \(v\) 能到的点 \(u\) 一定能到,这启发我们维护一个连通块,连通块有一个关键点,连通块内所有点都能到关键点。
类似 Boruvka,每次暴力 bfs 一个关键点,找到能扩展的另一个关键点并记录,然后能连就连,证明类似 Boruvka。
JOI 2020 Final
「JOI 2020 Final」只不过是长的领带
对于去掉一条领带之后的选择,一定是 \(A\) 中第 \(i\) 小配对上 \(B\) 中第 \(i\) 小,证明考虑交换两个人会使得 \(A\) 较大的那个人变大不优。
维护前后缀 \(\max\) 枚举人即可。
「JOI 2020 Final」JJOOII 2
首先要删掉的数量确定,为了最小化 \(3\) 操作就是最大化 \(1,2\) 操作。
另一个结论是,对于每种颜色选择一定是一段连续的,证明考虑两边的为了最大化一定会往中间凑,中间的往里缩。
枚举一段连续的 \(O\),即求前缀从右到左第 \(k\) 个 \(J\) 的位置,\(I\) 同理,栈维护即可。
「JOI 2020 Final」集邮比赛 3
显然走过的一定是一段区间,走完后一定在区间左右端点,而区间内的数不会连续考虑两次,这里的考虑指的是一个数只在第一次经过的时候决定拿不拿。
暴力的思路是 \(f_{l,r,T,0/1}\) 表示当前走过区间 \([l,r]\),人在左/右,时间在 \(T\),能拿的最大值。
发现 dp 的值很小,和状态交换一下,\(O(n^3)\)。
可以动态数组省空间。
「JOI 2020 Final」奥运公交
考虑暴力,每次翻转一条边,求出最短路,\(O(n^4)\)。
想一个优化,对于 \(1 \to n\) 的最短路,如果第 \(i\) 条边不在最短路上,那就不用再跑一遍最短路,直接与 \(dis(1 \to v) + w_i + dis(u \to n)\) 取 \(\min\) 即可。
但是最短路 dag 可能是 \(O(m)\) 级别,考虑如果 \(1 \to i\) 的最短路径有多于 \(1\) 条,那只有在他们的交集上翻转才能改变最短路,即我们跑一颗生成树,只对生成树上的边跑即可,\(O(n^3)\)。
「JOI 2020 Final」火灾
边界好难写,不想写。
考虑构造二维平面,横轴是序列,纵轴是时间。
发现每个点所占的位置是一个平行四边形,套路拆成三个三角形,现在需要三角形加,线段求和。
对于三角形考虑斜线,发现三角形内部的点直接是斜线下标后缀加等差数列,三角形外部是时间下标前缀加等差数列,差分维护即可。
「JOI Open 2020」家具摆放
小清新思维,还在我能想出来的范围内。
考虑判断条件,如果能保留当前还有用的联通点,那合法当且仅当每条斜线上都有至少一个空位置。
维护有用的点只需要看他四联通是不是都被堵上了,dfs 即可。
「JOI Open 2020」黑白点
想不到啊哥们。
首先有些显然的性质:比如 \(0011\) 匹配一定是 \((1,3),(2,4)\)。
再往后发掘直觉上是 \(0\) 和 \(1\) 的循环位移匹配。
观察一条线段,他能相交的上界是 \(\min(d-1,n-d)\),其中 \(d\) 是它的长度。
猜测上界能构造出来,这样长度为 \(x\) 贡献就是 \(x-1\)。
然后再把所有的 \(0\) 翻转,长度为 \(x\) 贡献就是 \(n-x+1\)。
也就是最小化 \(\sum x\)。
然后先把环断开,考虑一条边被覆盖次数,发现类似于均分纸牌。
然后由于可以随便断一条边,贡献变为 \(s_i - s_k\) 和 \(s_n - s_i + s_k\),猜测 \(k\) 选中位数。
我觉得不是人类能想到的。
「JOI Open 2020」发电站
首先炸掉的点选不选无所谓,所以实际上是选一个连通块。
考虑在连通块最高处统计答案。
记 \(f_u\) 表示考虑 \(u\) 子树内且 \(u\) 不为连通块最高点时候的答案。
首先如果 \(u\) 子树内选择点,那 \(u\) 就会被爆掉,所以最优秀的情况就是全选,也就是 \(\sum f_v-w_u\),如果子树内不选那自己选就是 \(w_u\)。
再考虑连通块最高处,如果子树内选多于两个点 \(u\) 就会被爆掉,也就是 \(\sum f_v-w_u\),如果子树内只选一个那自己选就是 \(\max f_v - w_u\)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理