2017.1.15【初中部 NOIP提高组】模拟赛B组

今天一开始以为没有B组,就去做C组。在比赛结束前一小时发现有B组,于是立刻来做,但已经来不及了,不然至少可以得100分。
  T1:这题十分简单。首先找出所有agnus,设它们的数量为m,用g[i]表示第i个agnus的起始位置(也就是a的位置)。
  然后我们有一个k来枚举当前子区间中包含的agnusd的个数,接着用一个i来枚举这k个agnus中的第一个,接着计算只包含这k个agnus的区间的个数。那我们怎么计算呢?
  我们知道计算一个包含agnus的区间的个数就是它左边能选的格子数乘它右边能选的格子数。现在问题就变成了求左边的格子数合右边的格子数。显然,左边的格子数等于g[i]-g[i-1],右边的格子数等于g[i+k]-g[i+k-1],那么问题就解决了。
  T2:这题的方法十分巧妙。
  我们把每条要染色起来的边看成一个点。先用一个二重循环求出那两条要染色的边有交叉,把它们所对应的点之间连上一条无向边。
  预处理好之后,我们用dfs对构成的图的每个点进行染色,有连边的两点不能同色,如果染色成功就输出sane,否则输出non。
  T3:我们为了保证分成的份数尽量多,那么就要分成的子字符串长度尽量小,那么我们可以用kmp求出最短子序列的长度,如果不知道kmp怎样使用,那么请看下面。
  首先把原序列扫一遍,在每扫到一个字符时,判断它和它后面的序列是否与当前最短序列相同,是则继续往后搜,不是则把这个字符加入最短序列,搜完之后的最短序列长度就是最终使用的答案了。

你可能感兴趣的:(【初中部,NOIP提高组,】模拟赛B)