区间替换模板:
int _sum, _max, _min, v;// 迎来记录查询的值, v是替换值。
int sumv[Max_N];
int minv[Max_N];
int maxv[Max_N];
int setv[Max_N];
int l ,r;// 查询区间
void maintain(int o, int L, int R)
{
int lc = o * 2, rc = o * 2 + 1;
sumv[o] = minv[o] = maxv[o] = 0;
if (R > L) {
sumv[o] = sumv[lc] + sumv[rc];
minv[o] = min (minv[lc], maxv[rc]);
maxv[o] = max (maxv[lc], maxv[rc]);
}
if (setv[o] >= 0) {
minv[o] = setv[o];
maxv[o] = setv[o];
sumv[o] = setv[o] * (R-L+1);
}
}
void pushdown(int o)
{
int lc = o * 2, rc = o * 2 + 1;
if (setv[o] >= 0) {
setv[lc] = setv[rc] = setv[o];
setv[o] = -1;
}
}
void updata(int o, int L, int R)
{
int lc = o * 2, rc = o * 2 + 1;
if (l <= L && r >= R) {
setv[o] = v;
}
else {
pushdown(o);
int M = L + (R-L) / 2;
if (l <= M) updata(lc, L, M);
else maintain(lc, L, M);
if (r > M) updata(rc, M+1, R);
else maintain(rc, M+1, R);
}
maintain(o, L, R);
}
void query(int o, int L, int R)
{
if (setv[o] >= 0) {
_sum += setv[o] * (min(R, r) - max(L, l) + 1);
_min = min(_min, setv[o]);
_max = max(_max, setv[o]);
}
else if (l <= L && r >= R) {
_sum += sumv[o];
_min = min(_min, minv[o]);
_max = max(_max, maxv[o]);
}
else {
int M = L + (R - L) / 2;
if (l <= M) query(o*2, L, M);
if (r > M) query(o*2 + 1, M + 1, R);
}
}
区间修改:
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cstring>
#include <math.h>
#include <queue>
#include <set>
using namespace std;
#define Max_N 1000000*4+1000
int _sum, _max, _min, v;
int sumv[Max_N];
int minv[Max_N];
int maxv[Max_N];
int addv[Max_N];
int l ,r;
void maintain(int o, int L, int R)
{
int lc = o * 2, rc = o * 2 + 1;
sumv[o] = minv[o] = maxv[o] = 0;
if (R > L) {
sumv[o] = sumv[lc] + sumv[rc];
minv[o] = min (minv[lc], maxv[rc]);
maxv[o] = max (maxv[lc], maxv[rc]);
}
minv[o] += addv[o]; maxv[o] += addv[o]; sumv[o] += addv[o] * (R-L+1);
}
void updata(int o, int L, int R)
{
int lc = o * 2, rc = o * 2 + 1;
if (l <= L && r >= R) {
addv[o] += v;
}
else {
int M = L + (R-L) / 2;
if (l <= M) updata(lc, L, M);
if (r > M) updata(rc, M+1, R);
}
maintain(o, L, R);
}
void query(int o, int L, int R, int add)
{
if (l <= L && r >= R) {
_sum += sumv[o] + add * (R - L + 1);
_min = min(_min, minv[o] + add);
_max = max(_max, maxv[o] + add);
}
else {
int M = L + (R - L) / 2;
if (l <= M) query(o*2, L, M, add + addv[o]);
if (r > M) query(o*2 + 1, M + 1, R , add + addv[o]);
}
}
单点更新:
#define Max_N 1000000*4+1000
int _sum, _max, _min, v;
int sumv[Max_N];
int minv[Max_N];
int maxv[Max_N];
int addv[Max_N];
int l ,r , P;
void updata(int o, int L, int R)
{
int lc = o * 2, rc = o * 2 + 1;
int M = L + (R-L) / 2;
if (R == L) {
minv[o] = v;
maxv[o] = v;
sumv[o] = v;
}
else {
if (P <= M) updata(o*2, L, M);
else updata(o*2+1, M+1, R);
minv[o] = min(minv[lc], minv[rc]);
maxv[o] = max(maxv[lc], minv[rc]);
sumv[o] = sumv[lc] + sumv[rc];
}
}
void query(int o, int L, int R, int add)
{
if (l <= L && r >= R) {
_sum += sumv[o];
_min = min(_min, minv[o]);
_max = max(_max, maxv[o]);
}
else {
int M = L + (R - L) / 2;
if (l <= M) query(o*2, L, M, add + addv[o]);
if (r > M) query(o*2 + 1, M + 1, R , add + addv[o]);
}
}