FJOI2021 简要题解


D1T1 加法方程

因为字母和数字是一一对应的,所以只要不同字母数多于 \(10\),方程一定无解,则一遍暴力地枚举答案的花销是 \(O(10!)\)

我们发现,对于不同的答案串,它们的本质可能是相同的。

我们对相加的两个串枚举,得到的本质不同的串最多只有 \(10!\) 个,这很少。

那我们只要预处理出所有本质不同的答案串,再到哈希表内查询即可。

D1T2 女生散步

简单题,容易发现并证明答案就是最大的 \(x\) 满足:\(\displaystyle\left\lfloor \frac{x+1}{2} \right\rfloor\left\lfloor \frac{x+4}{2} \right\rfloor<n\)

只要二分就可以轻松计算。

D1T3 最佳收益

这题有一个重要性质:\(a,b\) 中选择的连续段至少其中一个连续段 \(≥\) 其所在序列权值之和的一半。

因为如果不这样的话,直接全选某一个序列肯定更优。

假设我们钦定 \(a\) 选定的权值和超过一半,那第一个满足前缀 \(>\) 权值之和一半的位置 \(pos\) 是必定要选的。

假设我们知道 \(b\) 选了什么,贪心地想:从 \(pos\) 往两边尽量延伸一定是最优解。

\(f(l,r)\)\(b\) 序列选 \([l,r]\) 时的值,则有 \(f(l,r)=sumb[r]-sumb[l-1]+a\) 序列选取位置的权值和。(其中 \(sumb\) 表示 \(b\) 序列前缀和)

考虑枚举右端点,固定下 \(sumb[r]\),看看它会对那些左端点的权值产生影响,这实际上就是一个单调栈的过程,线段树维护即可。

复杂度 \(O(nlogn)\),常数较大,卡时才能过。

D2T1 遗传密码

一个很显然的暴力是把所有模式串正着插进一棵 \(Trie\),反着插进另一棵,每次转移先被动转移在主动转移。

如果串长比较大,直接在 \(Trie\) 树上暴力跳复杂度肯定爆炸,如果我们知道它可以(被)转移到的位置就可以用线段树优化。

这实际上就是一个求模式串与自己前缀的最长公共后缀、与自己后缀的最长公共前缀。

我们可以用 \(exkmp\) 求出。

那就很好做了,考虑根号分治,串长较小的用第一种做法,较大的用第二种做法。

时间复杂度 \(O(n\sqrt{nlogn})\)

D2T2 天文奇观

不会,咕了。

D2T3 外星飞碟

看到题乍一看不会做(实际也不会做

考虑打个表找个规律,发现答案就是 \(n!-2n-1\)

\(n\leq 10^{10}\) 直接暴力求似乎不好做,模数不固定,而且不是素数,没有太好的办法,怎么办呢…………

那就直接写 \(O(n)\) 的暴力,然后你就过了,这就是 \(FJOI\)


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM