题目:
题解:
懒标记:对区间打下的标记,在用到的时候会pushdown
作用的条件:
- 标记可以合并
- 可以快速更新区间信息(下传方便)
这个题目用到的区间修改,但不满足条件二,也就是无法快速更新区间和,而逐个更新对每个数取模太慢了
有一个很重要的结论:任何一个数log次取模以内就能变为0,并且a%b=a(a < b)
单点更新和区间和并无特殊之处,而对于每个区间取模操作,如同遍历这个区间所有的数字一样,逐个取模更新。但是若某个区间的区间最大值小于mod,那么这个区间就无需有任何操作。这相当于一个剪枝。所以我们需要两个数组,一个记录区间和,一个记录区间最大值。
其实就是一个优秀的剪枝了。
代码:
#include <cstdio>
#include <iostream>
#define LL long long
using namespace std;
const int N=100005;
int maxx[N*4],a[N];LL sum[N*4];
void updata(int now)
{
sum[now]=sum[now<<1]+sum[now<<1|1];
maxx[now]=max(maxx[now<<1],maxx[