這題主要就是多了乙個平方和的操作。
我們維護平方和的值的時候。
需要注意在下放的時候,要先把乘法之後的sum1算出來,這對算sum1最終的值沒有影響。
但是對sum2的值有影響。因為我們在計算中就在更新adtag的值,所以這個adtag它的sum1應該最終化。
#includeusingview codenamespace
std;
typedef
long
long
ll;typedef pair
int>pii;
const
int n = 1e4+5
;const
int m = 1e6+5
;const ll mod = 998244353
;#define pi acos(-1)
#define inf 1e18
#define ct0 cin.tie(0),cout.tie(0)
#define io ios::sync_with_stdio(false)
#define dbg(ax) cout << "now this num is " << ax << endl;
namespace
fastio
while(c >= '
0' && c <= '9')
return x*f;
}}using
namespace
fastio;
ll a[n];
struct nodenode[n << 2
];void pushup(int
idx)
void pushdown(int
idx)
void build(int l,int r,int
idx)
int mid = (l + r) >> 1
; build(l,mid,idx
<< 1
); build(mid + 1,r,idx << 1 | 1
); pushup(idx);
}void tree_mul(int l,int r,int
idx,ll val)
int mid = (node[idx].l + node[idx].r) >> 1
; pushdown(idx);
if(mid >= l) tree_mul(l,r,idx << 1
,val);
if(mid < r) tree_mul(l,r,idx << 1 | 1
,val);
pushup(idx);
}void tree_add(int l,int r,int
idx,ll val)
int mid = (node[idx].l + node[idx].r) >> 1
; pushdown(idx);
if(mid >= l) tree_add(l,r,idx << 1
,val);
if(mid < r) tree_add(l,r,idx << 1 | 1
,val);
pushup(idx);
}ll query(
int l,int r,int idx,int
id)
int mid = (node[idx].l + node[idx].r) >> 1
; ll ans = 0
; pushdown(idx);
if(mid >= l) ans += query(l,r,idx << 1
,id);
if(mid < r) ans += query(l,r,idx << 1 | 1
,id);
return
ans;
}int
main()
else
}return0;
}
牛客練習賽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 ...
牛客練習賽28 B 複習線段樹 )
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,mop...
資料結構 線段樹 牛客練習賽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...