Coders' Legacy 2020 题解

多测不清空,爆零两行泪。
多测不清空,爆零两行泪。
多测不清空,爆零两行泪。
后缀数组常数好大啊。
后缀数组常数好大啊。
后缀数组常数好大啊。

Chef vs Doof

略。


Doof on Cartesian

略。


Doof fires Brackets

为啥这题询问不也给一个 \(O(n)\) 的范围啊。


Jeremy gets a gift

bfs 都能写挂,真有我的。


Unique Substring

考虑用后缀数组求一下 \(rk\)\(ht\) 数组,然后就是个二维数点。
好玩的事情发生了,我跑一组 \(5*10^5\) 的只要一点几秒,跑 \(10^5\)\(5\) 的半分钟跑不出来,长教训了。


Perry learns Binary

\(or\) 操作是经典的线段树操作,对于查询给每个线段树节点套上一个 \(trie\) 就行。
多测不清空,爆零两行泪。


Phineas and Marks

博弈论好难啊,先鸽着,学会了再更新。
这个博主他没有鸽!!1
u1s1,慢慢分析找规律并不是很难...
这个问题是海盗分金问题加强版,分类标签是找规律和瞪眼法观察。下面阐述一下慢慢分析的过程。
题意简述:

\(n\) 个人,要分 \(m\) 个球,还会给出一个 \(k\), 要决定一个头领来分配球。
假设当前标号最大的人是头领,他会提出一个分配方案,每个人可以支持或者反对。
如果支持率达到了 \(50\%\),这个人就成为头领,方案也被采用。
如果支持率不到 \(50\%\),那么标号最大的 \(k\) 个人就会被干掉,如果不足 \(k\) 个人就会干掉所有人。
每个人想在保证自己不被干掉的情况下拿到尽量多的球,并在拿到尽量多的球的情况下干掉尽量多的人。
问最后的头领是谁,他自己最多能拿到几个球。
\(n,m,k\le10^9\)

解题思路:
分 类 讨 论。

\(\Large{Ⅰ.n\le2*k:}\)

\(\large{①.n\le k:}\)

显然答案是 \((n,m)\)

\(\large{②.k<n\le2*k:}\)

显然答案是 \((n,m)\)

\(\Large{Ⅱ.2*k<n\le2*(k+m):}\)

可以通过抵消干掉 \(2*k\) 个,所以剩下 \(n-2*k\) 个中要贿赂 \(\lceil\frac{n-2*k}{2}\rceil\) 个来保命,最后答案是 \((n,m-\lceil\frac{n-2*k}{2}\rceil)\)

\(\Large{Ⅲ.2*(k+m)<n:}\)

这个需要讨论细一点观察出规律。

大概有这么一个规律。
\(\large{①n\in[2m+2^ik+1,2m+(2^{i+1}-1)k]:}\)

这个时候第 \(n\) 个一定不是领队,需要找到一个 \(X\),使得 \(n-X*k\) 不在这个范围中,此时 \(n-X*k\) 要么在上面的情况中,要么就在下面的情况中,可以成为领队。

\(\large{②n\in[2m+(2^{i+1}-1)k+1,2m+2^{i+1}k]:}\)

这个时候第 \(n\) 个一定是领队,因为标号在 \([2m+2^ik+1,2m+(2^{i+1}-1)k]\) 中的人会无条件投给他,他只需要贿赂之前的人即可。

这样,我们就在 \(O(\log n)\) 的时间内解决了这个问题。

posted @ 2020-07-16 16:53  soroboruo  阅读(54)  评论(0编辑  收藏