P2023 AHOI2009 維護序列

2022-05-10 23:08:10 字數 1539 閱讀 2666

線段樹模板題

此題關鍵在於 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 把數列...