傳送門
思路:關鍵在於乘與加的先後計算關係,(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個用空...