A. Happy Birthday, Polycarp!
签到。
B. Make Them Odd
用一个set从大到小模拟一下这个过程即可。
C. As Simple as One and Two
题意:
给出一个串\(s\),现在要删除最少的字符,使得串中不含\(one,two\)。
思路:
直接的想法就是找到\(one,two\)就删除,但这里可能有个问题:比如\(twoone、tttwo\)这种,显然有较优的删除方法。
对于有单词重复的情况,显然我们删除一个\(w\)和一个\(n\)最优(因为只可能在两边重复)。
对于两个单词连接起来的情况,我们删除一个\(o\)最优。
所以分情况讨论即可。
D. Let's Play the Words?
题意:
给出若干个互不相同\(01\)串,问最少翻转多少次,满足:
- 所有串互不相同
- 存在一种方案,使得串能够拼接起来
这里的拼接不要求形成环,而是线性拼接起来,只要头尾相同即可拼接,并且我们可以任意安排顺序。
思路:
之后所说的\(xy\)串指的是头为\(x\),尾为\(y\)的串。
- 首先注意到我们翻转\(00,11\)串没用,我们可以只关注\(01,10\)串。
- 假设两者的数量分别为\(a,b\),不妨\(a<b\),在不考虑翻转的情况时,显然贪心进行拼接,即\(10-01-\cdots-10\)。
- 显然,我们只需要对\(\lfloor\frac{b-a}{2}\rfloor\)个\(10\)串进行翻转即可。
- 最后选择翻转的策略是能翻转就翻转,我们用一个\(map\)来判断是否能翻转即可。
- 另一种\(a\geq b\)的情况类似。
简而言之,贪心+\(map\)。
E. Two Fairs
题意:
给出\(n\)个点,\(m\)条边的无向连通图。
再给定两个点\(a,b\),询问\((x,y)\)的对数。其中\((x,y)\)为合法的一对需要满足\(x\)到\(y\)的路径必须经过\(a,b\)这两个点。
\((x,y),(y,x)\)为同一种情况。
思路:
一开始想的是将无向图缩点成一颗树,然后在树上搞。方法是可行的,但过于复杂。
原问题为两点路径必须经过\(a,b\),也就是说,从\(a\)点出发,必须经过\(b\)才能到达某个点;从\(b\)出发。必须经过\(a\)才能到达某个点。
那么我们跑两次\(dfs\),分别从\(a,b\)出发,找到从\(a,b\)出发不经过对方能到达的所有点,那么剩下的点就是必须经过才能到达的点。
将两者的数量相乘即为答案。
思路的本质是将“路径缩短”,原先跑\(n\)次的问题只需要跑两次。
代码如下: