对于单点修改区间查找,考虑线段树,维护区间最大活力值的最左位置和最右位置,以及区间内最大活力值之间的最大位置间隔。最大活力值之间的元素每小时会从两端各扩散一个,即每1小时有两个变为最大值,因此间隔长度为 d 时需要 ⌈d/2⌉ 小时;区间左端到最左最大值、最右最大值到区间右端每小时各扩展一个,分别需要对应距离的小时数。对于每个区间询问,答案即为上述三种时间的最大值。
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+3 ;
#define int long long
有一条长度为 n 的基因链,每个位置上的基因用小写字母表示。基因强度按字母顺序递增:a 最弱,b 次之,……,z 最强。
每一轮,基因链上所有位置会同时更新:第 i 个位置的新基因变为其自身以及左右相邻位置中强度最大的基因;如果某个方向不存在相邻位置,则忽略该方向。
你需要处理 q 次操作。操作分为两种:修改某个位置的基因;询问某个区间 [l,r] 全部被该区间内最强基因同化所需的最少轮数。每次询问相互独立,计算结果时只考虑该区间内部,区间两端视为没有额外相邻位置。
数据范围与保证:
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.