[質問ソリューション] LuoGu1438:退屈なシーケンス

元の質問ポータルは
、間隔に算術シーケンスを追加し、単一点の合計です。ツリー配列を使用して
2つのツリー配列を開くことができます。最初のツリー配列は合計を維持し、2番目はデルタデルタを維持します。d e l t a
Magicは、算術シーケンスに暴力を追加する方法を変更し、ツリー配列を使用してlogn lognのみを追加しましたl o g n場所ですが、デルタdeltaを保存する必要がありますd e l t a、合計する場合、累積合計とk ∗ deltak * deltakd e l t a、thiskkkは、実際の意味でのxx番目の要件です。X番号と現在の違い

特定の操作を理解すると、update(l、k、d)、update(r + 1、− k −(r − l + 1)∗ d、− d)update(l、k、d)を更新する方法がわかります。
、更新(r + 1、-k-(r-l + 1)* d、-d)u p d a t e l k d u p d a t e r+1 krl+1 d d

コード:

#include <bits/stdc++.h>
#define maxn 100010
using namespace std;
int n, m, a[maxn], tree[maxn][2];

inline int read(){
    
    
	int s = 0, w = 1;
	char c = getchar();
	for (; !isdigit(c); c = getchar()) if (c == '-') w = -1;
	for (; isdigit(c); c = getchar()) s = (s << 1) + (s << 3) + (c ^ 48);
	return s * w;
}

int lowbit(int x){
    
     return x & -x; }
void update(int x, int k, int d){
    
     for (; x <= n; x += lowbit(x)) tree[x][0] += k, tree[x][1] += d, k += d * lowbit(x); }
int query(int x){
    
     int s = 0, p = x; for (; x; x -= lowbit(x)) s += tree[x][0] + (p - x) * tree[x][1]; return s; }

int main(){
    
    
	n = read(), m = read();
	for (int i = 1; i <= n; ++i) a[i] = read();
	while (m--){
    
    
		int opt = read();
		if (opt == 1){
    
    
			int l = read(), r = read(), k = read(), d = read();
			update(l, k, d), update(r + 1, -k - (r - l + 1) * d, -d);
		} else{
    
    
			int x = read();
			printf("%d\n", query(x) + a[x]);
		}
	}
	return 0;
}

おすすめ

転載: blog.csdn.net/ModestCoder_/article/details/108477543