7.4模拟赛题解

比赛链接

link

T1

发现答案满足单调性,考虑二分答案,场上写的 check 可能是 \(\log\) 的,但是是 \(\log\) 不太可能,就是手动模拟过程,显然会被卡(

\(O(1)\) 方法如下:
首先如果初始拥有的数量 \(x\) 大于 \(m\) ,那么可以使用 \(m\) 个进行一轮繁殖获得 \(k\) 个新生的,此时剩余的部分如果大于等于 \(m-k\) 个,则可以与新生的部分再繁殖一次获得 \(k\) 个,容易发现这部分是循环的,并可以直接 \((x-m)/(m-k)\) 计算出轮数,设总轮数是 \(tmp\) 则可攻击的次数由三部分组成:

  • \((tmp+1)*m\) 代表初始的一次繁殖和后面的所有繁殖使用的 \(m\) 可以拿来攻击
  • \(k\) 最后一次繁殖完得到的
  • \((x-(tmp+1)*m+tmp*k)\) 算上繁殖得到的,最后剩下的零散的余数部分

check() 的代码为:

点击查看代码
ili bool check(int x){
	if(x<m) return x>=h;
	int tmp=(x-m)/(m-k);
	return (tmp+1)*m+k+(x-(tmp+1)*m+tmp*k)>=h;
}

本题同样有 \(O(1)\) 做法,详见 S2OJ 的题解区,思路上有部分重合,在这里不多说了。

T2

西安集训原题,但我没改()

又有重量又有价值,考虑背包,对于融合石头这部分非常宽松的条件是石头无限取,启发我们用一遍完全背包把对于每个重量的融合石头能得到的最大价值处理出来。

这时候相当于我们有了 \(m\) 件无限个数的商品要装进承重为 \(m\) 的背包,第二次完全背包求解即可。

注意初始化 \(dp\) 值为负无穷,避免错误转移。

T3

非常有趣的 \(KMP\) 题啊,没想出来感觉自己太蠢了(

对于题意的给出的修改操作,实际上就是让我们不再匹配字符串的真实值,而是考虑每个字符在串中的相对位置。

我们建立一个新串代表对应位的元素 \(x\) 上一次出现到当前为的距离 \(k\)

例如:

a b a b a
1 2 2 2 2

若模式串的新串能与主串的新串匹配,则这两者在题目中修改的意义下是可匹配的,因为对应元素的相对位置相同。

匹配时要注意新串中的值不能超出当前匹配的区间,因为上一次出现的位置完全不包含在当前区间则可以通过修改为不在这个区间中的任意元素来进行匹配,所以我们可以统一将这种情况的新串值设为 \(0\) 来方便匹配。

T4

本题样是 洛谷的P5443 [APIO2019] 桥梁

woc,完全不会啊,今天第一见对询问分块的???说什么攒询问等到达一定值再统一查询??这什么神秘操作,还有可撤销并查集,我现在还没会写呢,太神秘了我得先学习一下再写这题题解。

posted @ 2025-07-04 17:37  香香的鸽子  阅读(3)  评论(0)    收藏  举报