搞了整整一晚上加一下午 應該是懂了
加乘區間和別人的題解清晰易懂:這裡
平方和題目鏈結
注意:2.傳參的時候要清楚要傳的到底是什麼pushdown(1,l,r)找了很久
3.query的時候也要pushdown 因為只有這樣才能讓兒子進行完整的計算
#include #include #define ll long long
using namespace std;
const int n=100100;
ll a[n];
struct nodesegtree[n<<2];
inline int lson(int x)
inline int rson(int x)
void build(int t,int l,int r)
int mid=(l+r)>>1;
build(lson(t),l,mid);
build(rson(t),mid+1,r);
segtree[t].val=segtree[lson(t)].val+segtree[rson(t)].val;
segtree[t].val2=segtree[lson(t)].val2+segtree[rson(t)].val2;
}void pushdown(int t,int l,int r)
///*
void update1(int t,int l,int r,int s,int e,ll c)
pushdown(t,l,r);
int mid=(l+r)>>1;
update1(lson(t),l,mid,s,e,c);
update1(rson(t),mid+1,r,s,e,c);
segtree[t].val=segtree[lson(t)].val+segtree[rson(t)].val;
segtree[t].val2=segtree[lson(t)].val2+segtree[rson(t)].val2;
}///+
void update2(int t,int l,int r,int s,int e,ll c)
pushdown(t,l,r);
int mid=(l+r)>>1;
update2(lson(t),l,mid,s,e,c);
update2(rson(t),mid+1,r,s,e,c);
segtree[t].val=segtree[lson(t)].val+segtree[rson(t)].val;
segtree[t].val2=segtree[lson(t)].val2+segtree[rson(t)].val2;
}ll query1(int t,int l,int r,int s,int e)
pushdown(t,l,r);
int mid=(l+r)>>1;
return query1(lson(t),l,mid,s,e)+query1(rson(t),mid+1,r,s,e);
}ll query2(int t,int l,int r,int s,int e)
pushdown(t,l,r);
int mid=(l+r)>>1;
return query2(lson(t),l,mid,s,e)+query2(rson(t),mid+1,r,s,e);
}int main()
build(1,1,n);
while(m--)
else if(op==4)
else if(op==1)
else if(op==2)}}
return 0;
}
線段樹 區間加乘區間最大
如題,已知乙個數列,你需要進行下面兩種操作 1.將某區間每乙個數加上x 2.將某區間每乙個數乘上x 3.求出某區間每乙個數的和 第一行包含三個整數n m p,分別表示該數列數字的個數 操作的總個數和模數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包含3或4個...
線段樹 加 乘操作
include include using namespace std 題目中給的p int p 暫存數列的陣列 long long a 100007 線段樹結構體,v表示此時的答案,mul表示乘法意義上的lazytag,add是加法意義上的 struct nodest 400007 buildtr...
維護序列(線段樹維護區間乘 區間加)
給定乙個長度為n的原序列和模數mod,m個操作,a,b 區間乘c,a,b 區間加c,統計 a,b 的區間和。思路 線段樹維護的還是區間和,但是這裡我們需要用到兩個懶標記,乙個記錄加法,乙個記錄乘法,乘法懶標記下傳之後要重置為1而不是0。對於乙個乘法操作,他影響的是區間和還有這個區間的加法標記 乘法標...