JOISC 2016 题解
1|0JOISC 2016
loj 上有几乎全部的题目,写了题意的就是 loj 上没有的。
1|1D1T1
一开始把题目看错了,还写了棵线段树。
把询问离线,倒着扫一遍,就变成了求最长不上升子序列,用树状数组维护即可。
1|2D1T2
来自 Kubic 的神仙做法。
考虑 Filp 一个位置和剩下所有位置,记录每个数作为答案出现的次数,如果是 1 次,那么这个位置的答案就是这个数,否则对于所有出现次数为 2 的数,就是比这个数更好记的数,我们就可以确定这些数。
发现上述过程可以看做是排序的过程,把小于的数去掉,然后在大于的数里面继续排序。但是我们不知道这个数是什么,于是考虑随机化,每次随机一个我们要 Filp 的位置,这样做的期望次数是
1|3D1T3
很厉害的计数题。
先判断无解情况。如果 4 个角是空的或者第 1、3 行有连续 2 个空格就无解。这样第 1、3 行的空格就可以随意填了,相互之间没有影响。
从部分分入手。对于 subtask2,我们把空格形成的连通块拿出来,注意如果一个格子上下都有格子,那么也是可以随便填的,不能在连通块中,又根据无解的条件,可以发现现在最大的连通块大小也只有 5,可以直接暴搜,最后把所有连通块的答案拼起来。
我们还是从连通块入手。我们对第二行连续的空格求答案,然后组合起来。
设
- 第
列和第 列都是上下放置,转移就是 - 第
列左右放置,那么 要在 后面,有 - 第
列左右放置,那么 要在 后面,且 ,我们枚举第 列的 个空格有 个是在 之前放置,记之前的空格数是 , 表示 个棋子插入 个已放置的棋子中的方案数,有
复杂度
1|4D2T1
简单题。
假设我们把
1|5D2T2
很厉害的记搜题。
对于一个正方形,我们肯定是在能吃掉其中一块时紧接着吃另一块,那么对于先吃的一块,假设在左边,那么我们就需要先吃左边的三角形的左边一块,其他方向同理,那么我们就可以枚举每个点然后记忆化搜索,如果有环说明吃不了,这样就得到了
考虑优化。显然可以发现,我们的搜索有大量重复的状态。比如,如果右边的一块需要先吃左边的一块,那么我们搜右边一块时可以在左边一块的基础上搜。那么我们对于每一行,从左往右搜索,后一个继承前一个的状态就可以了。复杂度
1|6D2T3
挺好一题,但是把题目看错了。
首先找合法的充要条件。比如从后往前看,如果最后两个人都是男生,那么显然是不行的;我们一直推下去,就可以得出,如果把男生当做 1,女生当做 -1,那么条件就是后缀和不大于 1。
然后考虑我们怎么重排最优。我们的目的就是让男生尽量靠前,女生尽量靠后,那么可以每次把最后面的一个不合法的男生移动到开头,这样会让中间所有女生的代价加 1,会让后缀和加 1,那么我们需要
1|7D3T1
很新奇的交互题。
先明确我们的目的。我们要求出两两点对之间的距离,那么就必须求出每条边对应重标号意义下哪两个点。
首先容易用
因为只有 1/2/3,我们尝试进行三进制分组。具体地,我们依次枚举当前在确定哪一位,然后进行一遍深搜,每个点的标号就是三进制下当前位的值,那么对于一条返祖边,我们就可以求出它指向的点在当前位是多少,最终把这个三进制数转成十进制就是答案。
移动次数是
1|8D3T2
JOISC 竟然也会出神仙分块题。
先考虑
然后考虑拓展到一般的情况。我们此时的目的肯定是想办法尽量只关注序列的可重集,而题目的数据范围不大,时限却很大,不难想到分块。
我们将序列分块,每一块维护元素的可重集和每次会将对整个块进行操作的 A 有哪些。对于每次操作,整块可以直接把 A 加入可重集,然后把最大值弹出,这就是操作完的 A。
重点是散块如何处理。我们顺次考虑每个数,然后顺次考虑 A,如果当前的
设块长为 B,那么我们一次修改整块的复杂度是
1|9D3T3
简单题,但是思路总是对不上。
发现考虑连边不好处理,但是考虑删边就更方便一些。如果一个点的入度大于 1,那么就需要删到只剩一条入边,我们肯定是贪心地保留最大的入边。
问题是可能会有环,那么我们就需要断掉一条环边,选择一条最大的非环边,那么就求出每个点最大的入边和不在环上的最大入边,取差最小的一个就行了。
复杂度
1|10D4T1
图论题。
容易想到从一个地方开始停留到相邻的地方只需要两步,到冰块旁的地方停留只需要一步。现在有个问题,如果我们有可能重复利用之前放的冰块,那么我们就不好直接计算最小代价了,那么会不会有这种情况呢?
答案是不会的。因为我们从一个位置到一个我们停留过的位置再移动显然是没有直接从这个位置开始更优。
那么我们就可以直接建边跑最短路了。
1|11D4T2
题意:通信题。
Anya 和 Boris 有一棵有根树,每一天 Anya 会标记一些边,她可以给 Boris 发送一个不超过 1000 位的二进制串,Boris 要多次回答一个点到根的路径上有多少条边被标记过,他不知道这个二进制串,但是每次回答可以查看这个二进制串的 20 位。要求你给出两人的策略。
思路:很有意思的通信题,可能是受到了树分块的启发?
首先,Anya 要传递的肯定是每个点到根有多少条被标记的边,而直接传需要
因为是在一棵树上,我们尝试尽量多的继承祖先的信息来用更少的位来实现。这里体现了一点点树分块的思想,即标记一些关键点,然后把一个点到根的路径拆成这个点到最近的关键点和从关键点到根两部分。
具体地,我们把所有点按深度模 10 的余数分类,然后取其中数量最少的一类,把这些点标记为关键点。对于关键点,最多只有 50 个,我们记录这些点到根的路径上被标记的边的数量在二进制下的每一位,需要 9 位;对于非关键点,我们只记录这个点的父亲边是否被标记,需要 1 位。因此这一部分我们最多需要用 900 位。
对于 Boris,我们先从当前点往上跳,直到遇到一个关键点,这最多需要 9 次,然后我们查询这个关键点的信息,最多需要 9 次,于是我们就只需要最多询问 18 次来求出答案。
一个小坑点:题目中保证了对于每条边有
1|12D4T3
到了贪心策略,而且是对的,只不过有线性做法,但是看不懂。
因为是要让改动尽量少,那么就是要让匹配的数量尽可能多,那么就直接找到能匹配的范围内有没有同国家的,有就直接匹配,否则就需要修改。复杂度
__EOF__

本文链接:https://www.cnblogs.com/Xttttr/p/18013724.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
2023-02-12 NOIP2022游记
2023-02-12 CF1167G题解