面基之路
idea from he_____he, data,solution from hehezhou
算法一
首先需要注意到最重要的结论:题意等价于所有人走到同一位置所需最短时间。证明只需要让所有网友在面基成功之后跟随 hehe 蚤行动即可。
对于子任务
只需要求出会合到每一个位置的答案即可。时间复杂度
算法二
对于子任务
首先会合时间不可能更早,因为
算法三
首先汇合点在点上的情况是简单的,考虑汇合点在边上的情况。
定义边的左右侧是它的两个端点,枚举每个人是从哪一侧进入这条边的,每侧只需要考虑最晚进入的人即可,答案不难计算。
时间复杂度
算法四
由于每侧只需考虑最晚进入的人,对于每条边,一定存在一种最优方案,将所有人按照到达左侧时间排序后,一个前缀从左侧进入而剩余的后缀从右侧进入。
时间复杂度
bonus
如果 hehe 蚤的速度是
这个问题会在数日后被加入 uoj 题库。
机器人表演
idea, data from djq_cpp, solution from hehezhou
本题改编自 CPIdeas (https://codeforces.com/blog/entry/104374) 生成的题面:
You are given a string S consisting of 0 and 1. You can do the following operation on S any number of times: Choose a non empty substring T of S, and append 0 to the beginning and 1 to the end of T. The resulting string will be S again. How many different strings will S be after the operations? Find the count modulo 998244353.
算法一
我会状压!
接下来令左括号对应 0
,右括号对应 1
,合法括号前缀是满足任意前缀 0
不少于 1
的串,合法括号串是 01
个数相等的合法括号前缀,
首先我们考虑给定一个串
其中若
如果
对应这个 dp,我们可以列出求解原题的状压 dp。
时间复杂度
如果省略无用状态,可以额外通过子任务
算法二
我是打表大师!我打表转移找到规律了!
规律就是:对于固定的
可以只记录
时间复杂度
算法三
我喜欢严谨做题!我要证明这个结论!
先注意到几个重要性质:
两个合法括号前缀合成的串一定是合法括号前缀。考虑定义不难得出。
若
,则有 。考虑转移或考虑 dp 意义均不难得出。
考虑当前已经匹配了前
:显然新的最长前缀是 。否则若
(即左括号) 或 :那么 ,新的最长前缀是 。否则有
(即右括号)且 ,这种情况较为复杂。先给出结论:新的最长前缀 。第一步证明这个前缀是合法的:不难发现 是一个合法括号前缀,否则就存在更大的位置满足 。首先证明 ,只需要将 对应的合法方案中, 对应的子序列划为合法括号前缀部分,由性质 我们就得到了 对应的一组方案,因此 且可以转移到 。然后我们证明不存在更长的前缀 可以匹配 的前 个位置,否则 ,与性质 矛盾。
至此我们证明了这个结论。
期望得分
稳健型选手
idea,data,solution from xyr2005
谢罪!谢罪!谢罪!谢罪!谢罪!
算法一
我会暴力!状压当前剩下哪些数,复杂度
算法二
我会观察性质!先考虑单组询问。
首先,如果
考虑 QAQ 蚤取的数的集合要满足什么条件。令序列
那 QAQ 蚤可以贪心每次取
我们可以
复杂度
算法三
考虑优化算法二。
可以使用反悔贪心,从前往后扫,维护 QAQ 蚤取了哪些数。
每次加进来两个数
用堆维护上述过程,复杂度
算法四
我们发现,前
于是算法三也可以倒着来做,从后往前扫,维护 QAQ 蚤没取哪些数。
每次加进来两个数
于是我们现在可以在
复杂度
使用压位trie/veb 维护,复杂度
算法五
继续优化算法四。
使用分治,用主席树对
然后考虑合并
复杂度