AHOI2009 維護序列

2022-09-09 05:24:10 字數 1188 閱讀 6911

\(【題目描述】\)

有乙個長為\(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

\(【考點】\)

線段樹\(【做法】\)

維護兩個懶標記\(add_i\)和\(mul_i\),每次執行加法操作時,給對應的\(add_i\)加上那個數;每次進行乘法操作時,給對應的\(mul_i\)和\(add_i\)都乘上那個數。在標記下傳時,先下傳乘法標記,再下傳加法標記。

\(【**】\)

#include#includeusing namespace std;

typedef long long ll;

const int n=1e5+50;

ll sum[n*4],add[n*4],mul[n*4];

ll a[n];

int n,m,p;

void mul(int k,int l,int r,ll v)

void add(int k,int l,int r,ll v)

void pushdown(int k,int l,int r)

if(add[k])

add[k]=0,mul[k]=1;

}void build(int k,int l,int r)

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

build(k<<1,l,mid);

build(k<<1|1,mid+1,r);

sum[k]=(sum[k<<1]+sum[k<<1|1])%p;

}void modify(int k,int l,int r,int x,int y,ll v,int s)

ll query(int k,int l,int r,int x,int y)

int main()

if(k==2)

if(k==3)

}return 0;

}

線段樹 AHOI 2009 維護序列

老師交給小可可乙個維護數列的任務,現在小可可希望你來幫他完成。有長為n的數列,不妨設為a1,a2,an 有如下三種操作形式 1 把數列中的一段數全部乘乙個值 2 把數列中的一段數全部加乙個值 3 詢問數列中的一段數的和,由於答案可能很大,你只需輸出這個數模p的值。第一行兩個整數n和p 1 p 100...

AHOI2009 維護序列 線段樹

老師交給小可可乙個維護數列的任務,現在小可可希望你來幫他完成。有長為n的數列,不妨設為a1,a2,an 有如下三種操作形式 1 把數列中的一段數全部乘乙個值 2 把數列中的一段數全部加乙個值 3 詢問數列中的一段數的和,由於答案可能很大,你只需輸出這個數模p的值。線段樹,打個乘法lazy標記即可 i...

bzoj1798 ahoi2009 維護序列

time limit 30 sec memory limit 64 mb submit 3714 solved 1364 submit status discuss 老師交給小可可乙個維護數列的任務,現在小可可希望你來幫他完成。有長為n的數列,不妨設為a1,a2,an 有如下三種操作形式 1 把數列...