洛谷 3373 線段樹

2021-09-26 07:31:09 字數 1145 閱讀 7467

傳送門

思路:關鍵在於乘與加的先後計算關係,(x + y) * k = x * k + y * k,從這裡可以看出來,把加法轉化為乘法計算,取消了+與*先後順序

pushdown時,即為乘法標記 * 原有資料 + 加法標記 * 長度。

注意點:

這個題資料範圍取long long

讀入的k也是long long,傳入函式時用long long

個人wa點:pushdown時,暫存mul和add時,用了int

#include using namespace std;

#define ln(x) (x << 1)

#define rn(x) (x << 1) | 1

#define endl "\n"

#define ll long long

const int maxn = 1e5+5;

struct tree;

}tree[maxn*4+10];

ll a[maxn];

ll mod;

void pushup(int p)

void build(int l, int r, int p)

int mid = (l + r) >> 1;

build(l, mid, ln(p));

build(mid+1, r, rn(p));

pushup(p);

}void pushdown(int p)

void update(int l, int r, int p, int op, ll d)

else

return;

} if(tree[p].mul != 1 || tree[p].add) pushdown(p);

int mid = (nl+nr) >> 1;

if (l <= mid) update(l, r, ln(p), op, d);

if (r > mid) update(l, r, rn(p), op, d);

pushup(p);

}ll query(int l, int r, int p)

int main()

else

}return 0;

}

洛谷3373 線段樹2(線段樹)

rt,就是線段樹的模板,支援區間乘 區間加 區間求和。很有意思的一點是兩個標記的下傳,解決了就行了。然後這道題,作為ahoi,竟然是個裸的模板!可能年份久遠的原因吧。兩個一毛一樣嘛!includeusing namespace std typedef long long ll const ll ma...

線段樹2 洛谷p3373 線段樹

題目位址 解釋 多了乙個乘法操作,可以考慮優先順序。每次先算乘法。首先,對於乙個區間 和為s 假設已經按 a 乘b進行了操作。值得到的值為 s a b sb ab 假設先乘得到 sb a 這樣相比,add應該還要再乘上乙個b才對,所以,當更新到乙個區間時,為了進行先乘的操作而不讓結果發生變化,應該將...

洛谷 P3373 線段樹 2

作為一道調了三天的模板題,真的太虐心了對於理解線段樹大有用處。傳送門如題,已知乙個數列,你需要進行下面三種操作 1.將某區間每乙個數乘上x 2.將某區間每乙個數加上x 3.求出某區間每乙個數的和 輸入格式 第一行包含三個整數n m p,分別表示該數列數字的個數 操作的總個數和模數。第二行包含n個用空...