description:
qn姐姐給你了乙個長度為n的序列還有m次操作讓你玩,
1 l r 詢問區間[l,r]內的元素和
2 l r 詢問區間[l,r]內的元素的平方和
3 l r x 將區間[l,r]內的每乙個元素都乘上x
4 l r x 將區間[l,r]內的每乙個元素都加上x
input:
n,mopi li ri xi (for i=1...m)
output:
answers
analysis:
sum1[i] 表示區間和,sum2[i]表示區間平方和
add[i]表示同加延遲標記,mul[i]表示同乘延遲標記
注意更新延遲標記的時候,mul會對add產生影響
referenceo_o:
#define _crt_secure_no_warnings
#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
#define _for(i,a,b) for(int i=(a);i<(b);++i)
#define _rep(i,a,b) for(int i=(a);i<=(b);++i)
typedef long long ll;
const int inf = 1 << 30;
const int maxn = 10005;
const int mod = 1e9+7;
const double eps = 1e-6;
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
const int m = 301, b = 500;
int n, m;
ll add[maxn << 2], mul[maxn << 2], sum1[maxn << 2], sum2[maxn << 2];
ll a[maxn];
void pushup(int rt)
void build(int l,int r,int rt)
int mid = (l + r) >> 1;
build(lson);
build(rson);
pushup(rt);
}void pushdown(int rt, int len)
void update(int l, int r, int rt, int l, int r, int val, int type)
else
} pushdown(rt, r - l + 1);
int mid = (l + r) >> 1;
if (l <= mid) update(lson, l, r, val, type);
if (r > mid) update(rson, l, r, val, type);
pushup(rt);
}ll q1, q2,res;
void query(int l, int r, int rt, int l, int r)
int mid = (l + r) >> 1;
res = 0;
pushdown(rt, r - l + 1);
if (l <= mid) query(lson, l, r);
if (r > mid) query(rson, l, r);
}int main()
build(1, n, 1);
int op, l, r;
ll v;
while (m--)
else if (op == 2)
else if (op == 3)
else
} }return 0;
}
《牛客練習賽28 B》
這題主要就是多了乙個平方和的操作。我們維護平方和的值的時候。需要注意在下放的時候,要先把乘法之後的sum1算出來,這對算sum1最終的值沒有影響。但是對sum2的值有影響。因為我們在計算中就在更新adtag的值,所以這個adtag它的sum1應該最終化。includeusing namespace ...
資料結構 線段樹 牛客練習賽28B
op 1 sum op 2 sum2 平方和 op 3 mul op 4 add 2個lazy標記 include include using namespace std define lc rt 1 define rc rt 1 1 define mid l r 2 typedef long lo...
牛客練習賽28 B 資料結構
題目描述 qn姐姐最好了 qn姐姐給你了乙個長度為n的序列還有m次操作讓你玩,1 l r 詢問區間 l,r 內的元素和 2 l r 詢問區間 l,r 內的元素的平方和 3 l r x 將區間 l,r 內的每乙個元素都乘上x 4 l r x 將區間 l,r 內的每乙個元素都加上x 第一行兩個數n,m ...