The Preliminary Contest for ICPC Asia Xuzhou 2019
•参考资料
[1]:官方题解(提取码:g5q6)
E. XKC's basketball team(思维)
•题意
n 个人,每个人都有权值,其中第 i 个人的权值为 $w_i$;
定义一个 $anger$ 值,$\forall \ j \in [i+1,n]\ ,\exists\ w_j \geq w_i + m\ ,\ anger=max\{j-i-1\}$;
求这 n 个人的 $anger$;
•方法一(倒推+维护递增序列)
•Code
•方法二(ST表+二分)
提前预处理出 w 的 ST 表;
对于第 i 个人,二分查找距离他最远的并满足 $w_j \geq w_i + m$ 的 j;
比赛的时候就是用的这个方法,WA 到我怀疑人生;
赛后重做,找到 bug,这个 bug 能让我气死---求反了!!!!!
题目要求求的是使得 $w_j \geq w_i + m$ 的最远的 j,比赛时读的题意也是这个;
可在我写代码时,却写成了判断是否有使得 $w_j + m \geq w_i$ 的 j,并求出最远的那个;
我擦,这么智障的错误竟然也会犯,并因此导致 debug 一个多小时,生气!!!
•Code
•感悟
比赛的时候,光想着用一些高级的数据结构来解决这道题,却缺失了思维;
思维不过关,注定要当一只蒟蒻,并且一直都是;
G. Colorful String(回文自动机)
•题意
给你一个字符串 s,假设 s 中共有 k 个回文串;
让你求解 $ans=\sum_{i=1}^{k} val_i$;
其中 $val_i$指的是第 i 个回文串中不同的字符个数;
•题解
求解 s 中所有的回文串,第一反应就是回文自动机;
但是对于回文自动机求出的回文串,如何快速求解这个回文串中不同的字符个数呢?
方法一:
将回文自动机求出的所有回文串的左右端点[l,r]以及相应的cnt保存,离线或在线求解 s 中 [l,r] 区间内不同字符的个数;
可以参考这道题目【洛谷 P1972 [SDOI2009]HH的项链】学习如何快速求解;
方法二:
利用回文自动机节点间的联系快速求解;
假设当前插入的字符为 $s_i$;
在插入 $s_i$ 前会求解 cur 节点,使得在 cur 节点所表示的回文串的两端添加字符 $s_i$ 依旧会形成回文串;
那么,我们可以定义一个数据结构:
unordered_set<char >_set[maxn];
_set[ i ] 插入的是节点 i 的所表示的回文串中的字符,并通过 set 去重;
那么,假设插入 $s_i$ 后形成一个新的回文串,并放在了 x 节点里;
那么,我们只需要将 _set[x] 中插入 _set[cur] 的所有字符+新增字符$s_i$ 即可通过 _set[ x ].size() 快速找到 x 节点所包含的不同的字符个数;
M. Longest subsequence(思维)
•题意
给你两个串 S,T;
让你在 S 串中找比 T 串字典序大的串,并输出长度最长的那个;
如果不存在,输出 -1;
•题解
首先,可以在 O(n) 的时间复杂度内求出 S 串包含的 T 串的最长前缀对应的位置;
我用数组 p 记录;
即 $S_{p_1} = T_1\ ,\ S_{p_2} = T_2\ ,\ \cdots\ ,S_{p_x}=T_x\ ,p_1 < p_2 <\ \cdots\ p_x$;
x 指得是最多匹配了 T 串的前 x 个字符;
关于 p 数组的求解,和【2019南昌网络预选赛 M.Subsequence】这道题很想,你可以参考我的这篇博客求解;