線段是是乙個很好用的資料結構,特別是在於長長的板子
先來乙份線段樹1的**
#include#includeac2的難度提公升了,因為有兩種不同的操作,加和乘。#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;
}
我們不難發現,應該先乘後加,不然會碰到乙個除法。
並且在乘的時候要給兩個懶標記一塊乘
注意懶標記的初始化和取模
**時間
(線段樹這東西太長了)
#include#includeacintn,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;
}
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項的初始值。接下來...