JOISC 2015 题解
1|0JOISC 2015
loj 上有几乎全部的题目,写了题意的就是 loj 上没有的。
1|1D1T1
简单题。
因为
1|2D1T2
直接暴力复杂度就是
1|3D1T3
怎么直接加难度了啊。
考虑枚举最后保留的最大值的位置,这样两边可以分别计算贡献。
以左侧为例,我们可以设计 DP,设
1|4D1T4
做过类似的题目 Password,做法是大致相同的,就是用图论建模。
考虑对于一种操作
因为只用翻转两个区间,翻转的方式很少,可以简单判断。
1|5D2T1
可能算是结论题。
首先考虑如果我们知道了 A 数组,如何判断是否合法。
条件是
然后考虑计数。
- 如果存在一个位置使得它比前缀最大值大超过 2,那么显然无解。
- 如果存在一个位置使得它比前缀最大值大 2,那么只能有一个这样的位置,而且前缀最大值 +1 这个数可以填在最远的前缀最大值和当前数中间的位置。
- 否则除开最后一个位置,每个位置有前缀最大值个数可以填(不 +1 是为了防止有重复),最后一个位置可以填前缀最大值 +1 个数,累加起来就是答案。
1|6D2T2
挺不错的题目。
容易想到考虑每一段时间的贡献。假设这一段开始是员工 A,结束是员工 B,有 4 种情况:
- A 进来,B 出去,这一段时间直接可以关门;
- A 进来,B 也进来,那么无论 A 是否有钥匙,只有 B 有钥匙这一段时间才可以关门;
- A 出去,B 也出去,和上一种类似,无论 B 是否有钥匙,只有 A 有钥匙这一段时间才可以关门;
- A 出去,B 进来,那么只有 A,B 都有钥匙这一段时间才可以开门。
我们观察贡献的形式,发现是形如如果一个人有钥匙那么会有一些时间可以关门,两个人都有钥匙那么有一些时间可以开门,如果转到图上,就等价于每个点有点权,有一些带边权的有向边,我们要给 k$ 个点染色,要使被染色的点的点权和加上两端都被染色的点的边权和最大。
同时我们可以发现更强的性质。对于一个点,出边和入边最多只有一条,而且起始点和终止点的度数都是 1,换言之,这张图的每个联通块都是链,那么就可以直接 DP 了。
具体地,我们设
1|7D2T3
树剖板子。离线下来建树,然后在链上用线段树维护即可。
1|8D3T1
很有意思的题目。
首先容易做到
我们先考察排序的区间和回文区间的关系。
- 如果两个区间无交,那么显然排序不会对回文串长度有影响。
- 如果排序区间包含了回文区间,那么答案就是最多的相同字符数,容易求出。
- 剩下的情况可以根据两个区间的中点的关系分成两种,这两种可以通过把回文串翻转来转化,于是只用考虑一种。
不妨设排序区间的中点在回文串中点右侧,根据排序区间和回文串右半部分的关系,可以分为 4 种,但这 4 种可以一起考虑。(下面的图都来自 官方题解)
具体地,对于前两种情况,我们枚举回文串中心,暴力往外拓展找最长的回文串,然后考虑两边的贡献;对于后两种情况,我们枚举排序区间左侧的前一个数作为的左端点,往右找到最近的比左端点前的数小的第一个数,那么最终回文串中心的一段都是这个数,然后再考虑两边的贡献。这时两种情况后面的处理大致相同了。
我们从左端往左找最长的不下降连续段,记录每个数的出现次数,然后从右端点开始往右扫。对于前两种情况,遇到小于左端点的数就停止;对于后两种情况,直到遇到比第一个遇到的比左端点小的数更小就停止。对于前两种情况,在扫描的过程中,两边的贡献就是右边从小到大第一个出现次数超过左边的数之前的数的个数;对于后两种情况,贡献就是比左端点小的数的个数加上右边从小到大第一个出现次数超过左边的数之前的数的个数(不算比左端点小的数)。
说起来比较抽象,看图就好理解了。
左侧有一个
需要注意的是对于第一种情况,排序区间的右端点往右的部分也可能和左边形成回文串,提前预处理出
复杂度
1|9D3T2
发现了每次会加入的一定是确定的,完全没想到可以直接暴力维护当前栈顶的前 3 个。
具体地,我们维护当前栈的前 3 个和上一个取走的卡牌,记作
1|10D3T3
题意: 通信题。
有一棵
思路:又是通信题,不过好像比前一道通信题简单不少。
部分分是好想的(以下默认以起点为根)。
对于 subtask1,直接每个点的标号都是其深度即可。
对于 subtask2,每个点的标号都是深度对 3 取模的结果即可。
然后来看正解。我们之前要用不止 0/1 的信息是因为要把一个点的父亲和孩子区分开来,而在只有一个孩子的情况下不能处理。我们仔细读一遍题,注意到题目额外给了 B 每个点的编号,这是部分分不需要的,那我们考虑怎么用这个额外信息。我们可以钦定,如果两点上的标号一样,那么就向号大的一边走,否则根据哪个点是 1 决定是向编号大的一边走还是想编号小的一边走。本来,我们需要父亲节点和儿子节点不同,但是不能处理儿子数是 1 的情况,现在借助编号的大小关系就可以解决了。
1|11D4T1
不算很难想。
直接把边从大到小排序后一次加入,暴力维护
1|12D4T2
很有意思的交互题。
容易想到用栈来匹配,但是问题在于有两种括号和我们只能储存 22 位 01。
因为操作次数是
那么我们需要记录的信息有:要匹配那一位,当前在哪一位,当前栈的大小,当前正在匹配的括号的类型,前 3 种信息需要记录的数字不超过 100,可以用 7 位存下,最后的括号类型可以用 1 位存下,合起来刚好是
1|13D4T3
神仙题。
首先,每个防壁的移动是独立的,每次移动是
接着我们先去掉一部分无用的激光。假设有连续 3 次激光的大小关系相同,如
从上一步受到启发,如果防壁的长度极小,每一次都会移动
如果有
注意边界情况。
- 如果没有
和 那么不用删掉这两个点; - 如果没有
,那么就不能删掉 ,因为左端点不一定在 ; - 如果没有
,同上,不能删掉 。
这个过程中我们要至少 3 个点,如果不到 3 个点可以暴力操作。
去掉了
上面的删除是按照
那么我们可以用可删除堆来取出最小的
__EOF__

本文链接:https://www.cnblogs.com/Xttttr/p/18013720.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题解