Codeforces Round 1087 (Div. 2)
Codeforces Round 1087 (Div. 2)
A. Flip Flops
Solution
显然从最弱的开始打,不容易死。只要不死,就使劲丢flip-flop,提升战斗力。
Code
Show Code
1 | signed main() { |
B. Array
Solution
题意是,对于每个下标,找到一个,使得的个数最多,输出这个最多的个数。
等价于到的距离。如果,则所有的到的距离都比大,反之亦然,所以说最大的数量就是满足和的数量中较多的那一个。
比较小,暴力计算即可。倒着遍历加一个树状数组可以做到。
Code
Show Code
1 | signed main() { |
C. Find the Zero
Solution
有趣的小题。
首先,可以发现,只要评测机告诉你一次,答案就是你问的两个中随便一个。
由于只有次询问,所以有两个思考的方向:
- 全部询问都和某一个相关。但是只要是一个非的就等于只得到了一个信息,肯定不够。
- 两两组成一对来问。
现在分析第二种:
- 我们先花次询问两两全部问好(第个和第个绑定,且评测机报了个),那么我们就知道,每两个之间有一个和一个非;
- 现在我们选择第个和第个,以及第个和第个做两次询问。如果报的是两个,那么第个一定不是,报告答案为;否则输出即可。
这样就获得了一个的方法。但是题目要求,可以尝试优化。
现在我们现不问,保持询问和,则
- 由于前面次询问都是,所以我们可以确定,和中一定有一个,否则前面应当有;
- 如果和都是,那么1. 如果是,那么和都不是,则一定是;2. 如果不是,那么一定是。所以不管怎样都是,直接报告即可。
这样就得到了次的方法。
Code
Show Code
1 | signed main() { |
D. Ghostfires
Solution
按照中的数量分情况考虑:
- 只有一个不为:最多再放一个;
- 只有两个不为:两个交替放,直到回到情况;
- 三个都不为,则有两种情况:
a. 如果三个数量相同,则类似RGB|GBR|BRG|...轮换放,可以全部放完(第一个RGB一定有办法放出,可见后续证明);
b. 如果三个数量不完全相同,每次放较多的两个直到三者相同,或者回到情况2。如果只有最多的多一个,先放一个最多的,然后回到三者相同的情况。
现在证明三个相同时,一定有合法的放法:
设当前字符串为。不失一般性,
- 假设的最后三个字母是
RGB(如果,补到三个,后续去掉不会影响结论),那么加上GBR即可; - 假设最后三个字母是
RGR(如果,补到三个,后续去掉不会影响结论),则加上GRB即可。
所以不管之前怎么放,只要到了三者相同的情况,一定能全部放完。
Code
Show Code
1 | struct node { |
E. A Trivial String Problem
Solution
,看起来可过。
所以我们直接拆到每一次询问,问题变成:
对于一个长度为的字符串,求出$$\sum_{i=1}^n f(s[1:i])$$
令,假设当前已经求出了,且假设,假设字符串是满足:
- ;
- 是的前缀,也是的后缀;
- 是满足条件1, 2的字符串中最短的一个。
那么我们就可以做更新:$$f[i] = f[i - m] + 1$$
证明:
假设存在一种分割方式,没有在处做分割,那么这种分割方式的最后一次分割一定在之前(如果在后面就不满足的最短性质),所以我们添加一个的分割,一定是更优的,矛盾。
关键是怎么对于,求出这个。
回顾KMP,它做的是满足条件1, 2的字符串中,最长的一个。那么我们不停的跳失配指针,直到跳到之前,获得的应该就是最短的(如果不是最短的,那么不应该跳到)。
所以,我们记一个数组:
这样,就代表了对应的字符串的长度。
所以转移的时候
Code
Show Code
1 | using it = std::string::iterator; |
F. Dynamic Values And Maximum Sum
Solution
最重要的observation:取完第一次后,所有的value都集中在叶子结点,后面再怎么取,value都不会改变。
所以问题转化为:挑选一个跟节点,让除了以外的所有节点都跑到自己子树中,离自己最远,且编号最小的节点去,然后取前大的value。
对于确定根情况下,每个点会跑到哪个节点去,是可以遍历求出来的。所以得到了一个简单的办法。
我们不妨先假设为根节点,求出每个节点会跑到的节点。然后开始换根,每次根从换到的时候,只需要将要到的节点改为子树外离最远的节点(这个可以通过上面传下来的+子树内但非子树内的部分合并求解)。
同时维护两个multiset:里面放较多的个value,里面放较少的个value。每次换根的时候,从或者里面重新erase再insert一下,然后维护一下比大的性质,这一部分是的。再维护一个,在和变动时,也同步变动。这样就可以求解。
Code
Show Code (nlogn)
1 | using LL = long long; |
Show Code (n^2)
1 | int Dfs1( |
datamaker
1 |
|
judger (python)
1 | import os |