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

  2019ICPC徐州网络赛E(1).cpp

•方法二(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

  2019ICPC徐州网络赛E(2).cpp

•感悟

  比赛的时候,光想着用一些高级的数据结构来解决这道题,却缺失了思维;

  思维不过关,注定要当一只蒟蒻,并且一直都是;


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的项链】学习如何快速求解;

    2019ICPC徐州网络赛G(1).cpp

  方法二:

    利用回文自动机节点间的联系快速求解;

    假设当前插入的字符为 $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 节点所包含的不同的字符个数;

    2019ICPC徐州网络赛G(2).cpp

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】这道题很想,你可以参考我的这篇博客求解;

原文地址:https://www.cnblogs.com/violet-acmer/p/11489814.html