P3373 模板 線段樹 2

2022-04-06 15:04:00 字數 2472 閱讀 1903

線段是是乙個很好用的資料結構,特別是在於長長的板子

先來乙份線段樹1的**

#include#include

#include

intn,m;

long

long sum[400005], lazy[400005

];int

f,x,y;

long

long

k;void pushdown(int x, int l, int

r)

return;}

void pushup(int

x)void update(int x, int l, int r, int l, int r, long

long

d)

int mid = (l + r) >> 1

; pushdown(x, l, r);

if (l <= mid) update(x << 1

, l, mid, l, r, d);

if (r > mid) update(x << 1 | 1, mid + 1

, r, l, r, d);

pushup(x);

}long

long query(int x, int l, int r, int l, int

r)

int mid = (l + r) >> 1

; pushdown(x, l, r);

long

long ans = 0

;

if (l <= mid) ans += query(x << 1

, l, mid, l, r);

if (r > mid) ans += query(x << 1 | 1, mid + 1

, r, l, r);

return

ans;

}int

main()

for(int i=1;i<=m;++i)

else

}return0;

}

ac2的難度提公升了,因為有兩種不同的操作,加和乘。

我們不難發現,應該先乘後加,不然會碰到乙個除法。

並且在乘的時候要給兩個懶標記一塊乘

注意懶標記的初始化和取模

**時間

(線段樹這東西太長了)

#include#include

intn,m;

long

long mod = 571373

;long

long sum[400005],lazyadd[400005],lazymul[400005

];int

x,y,f;

long

long

k;void pushdown(int x,int l,int

r)

if (lazyadd[x] != 0)

return;}

void pushup(int x)

void update1(int x,int l,int r,int l,int r,long

long d)

int mid=(l+r)>>1

; pushdown(x,l,r);

if(l<=mid) update1(x<<1

,l,mid,l,r,d);

if(r>mid) update1(x<<1|1,mid+1

,r,l,r,d);

pushup(x);

}void update2(int x,int l,int r,int l,int r,long

long

d)

int mid=(l+r)>>1

; pushdown(x,l,r);

if(l<=mid) update2(x<<1

,l,mid,l,r,d);

if(r>mid) update2(x<<1|1,mid+1

,r,l,r,d);

pushup(x);

}long

long query(int x,int l,int r,int l,int

r)

long

long ans=0

;

int mid=(l+r)>>1

; pushdown(x,l,r);

if(l<=mid) ans+=query(x<<1,l,mid,l,r),ans%=mod;

if(r>mid) ans+=query(x<<1|1,mid+1,r,l,r),ans%=mod;

return

ans;

}int

main()

for(int i=1;i<=m;++i)

if(f==2

)

if(f==3

) }

return0;

}

ac

P3373 模板 線段樹2

如題,已知乙個數列,你需要進行下面三種操作 1.將某區間每乙個數乘上x 2.將某區間每乙個數加上x 3.求出某區間每乙個數的和 include include using namespace std const int maxn 100005 int n,m,p long long arr maxn...

P3373 模板 線段樹 2

ac 這裡的延遲標記要開兩個,分別記錄加法的值和乘法的值,但是乘法和加法的優先順序不一樣,不規定他們的順序的話會有錯誤,所以可以規定乘法優先,即規定好該結點的值等於該節點的值 父節點的乘法延遲標記的值 父節點加法延遲標記的值 區間長度,即,sum num 2 sum num 2 add num wc...

P3373 模板 線段樹 2

題目描述 如題,已知乙個數列,你需要進行下面三種操作 1.將某區間每乙個數乘上x 2.將某區間每乙個數加上x 3.求出某區間每乙個數的和 輸入格式 第一行包含三個整數n m p,分別表示該數列數字的個數 操作的總個數和模數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來...