《Alien DNA》..
这题就是直接倒过来模拟,关键是实现细节..对于每个位置,我们只要知道它是输入的某个位置,还是和前面某个位置相等即可,这样最后可以一遍推出答案。我们维护一个有K个位置的链表,每确定一个位置,就把它从链表中删去。这样我们每次只需要找到“待复制块”的起点和终点(终点下一个位置开始存放该块复制的结果)。这段确定后,可以将其删去。因此现在我们只需要快速定位。我们可以用数组模拟链表,并且再用两个数组表示每个位置的上一个和下一个。这样就能完成链表的功能,而不用真正删除。这样做的好处是,可以实现快速定位——因为操作数很小(5000个),所以任何时候整个序列最多有5000段被删除的元素,也就是最多5001段连续的元素。因此对于每个操作,定位时可以暴力——沿着整个块走,最多5000步,走到最后不完整的块时,因为块内元素下标连续,所以不需要暴力扫描(实际上暴力扫描会退化。。因为块大小不是均匀的),直接下标加上去即可(这就是数组模拟链表的好处。。)任何时候定位都可以这么走。问题就解决了..
这题就是直接倒过来模拟,关键是实现细节..对于每个位置,我们只要知道它是输入的某个位置,还是和前面某个位置相等即可,这样最后可以一遍推出答案。我们维护一个有K个位置的链表,每确定一个位置,就把它从链表中删去。这样我们每次只需要找到“待复制块”的起点和终点(终点下一个位置开始存放该块复制的结果)。这段确定后,可以将其删去。因此现在我们只需要快速定位。我们可以用数组模拟链表,并且再用两个数组表示每个位置的上一个和下一个。这样就能完成链表的功能,而不用真正删除。这样做的好处是,可以实现快速定位——因为操作数很小(5000个),所以任何时候整个序列最多有5000段被删除的元素,也就是最多5001段连续的元素。因此对于每个操作,定位时可以暴力——沿着整个块走,最多5000步,走到最后不完整的块时,因为块内元素下标连续,所以不需要暴力扫描(实际上暴力扫描会退化。。因为块大小不是均匀的),直接下标加上去即可(这就是数组模拟链表的好处。。)任何时候定位都可以这么走。问题就解决了..
