線段樹模板題
此題關鍵在於 pushdown
考慮加法標記 lt1 和 乘法標記 lt2
考慮到乘法優先順序 要 高於 加法優先順序
因此在 pushdown 裡先 傳 lt2 再傳 lt1
注意 lt2 傳的時候,兩個兒子的 lt1 也都要乘上 lt2
code:
#include #define int long long
using namespace std;
const int n = 100005;
int n, m, p, a[n], maxid = -1, ans1[n], ans2[n], cnt = 0;
template inline void read(t &t)
while(ch >= '0' && ch <= '9')
t *= m;
} struct stree tree[n << 4];
void pushdown(int rt)
// checked
void pushup(int rt)
// checked
void build(int l, int r, int rt)
int mid = (l + r) >> 1;
build(l, mid, rt << 1), build(mid + 1, r, rt << 1 | 1);
pushup(rt);
}int quary(int l, int r, int l, int r, int rt)
void upd1(int l, int r, int c, int l, int r, int rt)
if(tree[rt].lt1 != 0 || tree[rt].lt2 != 1) pushdown(rt);
int mid = (l + r) >> 1;
if(l <= mid) upd1(l, r, c, l, mid, rt << 1);
if(r > mid) upd1(l, r, c, mid + 1, r, rt << 1 | 1);
pushup(rt);
}void upd2(int l, int r, int c, int l, int r, int rt)
if(tree[rt].lt1 != 0 || tree[rt].lt2 != 1) pushdown(rt);
int mid = (l + r) >> 1;
if(l <= mid) upd2(l, r, c, l, mid, rt << 1);
if(r > mid) upd2(l, r, c, mid + 1, r, rt << 1 | 1);
pushup(rt);
}signed main()
build(1, n, 1);
read(m);
for(int i = 1; i <= m; i++)
if(opt == 2)
if(opt == 3)
}return 0;
}
洛谷P2023 AHOI2009 維護序列
題目鏈結 p2023 ahoi2009 維護序列 解題思路 經典線段樹題目 注意 一定記得要取模!而且建樹時要把乘法lazytag 即t i mul 置為1!如果不用讀入優化就老老實實scanf,否則容易超時 做這個題之前或者做完這個題想再鞏固一下,可以看看這道題,兩道題幾乎一模一樣 洛谷p3373...
AHOI2009 維護序列
題目描述 有乙個長為 n n leq 10 5 的序列,支援三種操作,分別是給一段區間 l,r 內的所有數加上 乘上乙個數,以及求一段區間 l,r 中的數字的和。輸入樣例 7 43 1 2 3 4 5 6 7 51 2 5 5 3 2 4 2 3 7 9 3 1 3 3 4 7 輸出樣例 2 358...
bzoj1798 ahoi2009 維護序列
time limit 30 sec memory limit 64 mb submit 3714 solved 1364 submit status discuss 老師交給小可可乙個維護數列的任務,現在小可可希望你來幫他完成。有長為n的數列,不妨設為a1,a2,an 有如下三種操作形式 1 把數列...