poj3468鏈結
給出兩個操作:線段樹的區間修改和點修改相比多了乙個add陣列,add陣列的作用是在進行區間更新的時候不必將和該區間有關的所有線段都更新,某個線段的add陣列的含義是:1:將乙個區間裡的都數增加c
2:查詢區間(a,b)內的和
該線段的子線段的sum值都應該增加add(該線段的sum值已經增加了)但現在還沒增加,也就是相當於延遲的作用某個線段的add延遲資訊在要去查詢該線段的子區間的時候將會下推(pushdown)去更新它的子區間。
#include
using namespace std;
#define maxn 100007
typedef long long int ll;
ll sum[maxn*4];
ll min[maxn*4];
ll max[maxn*4];
ll add[maxn*4];
ll a[maxn];
void pushup(int rt)
void build(int l,int r,int rt)
intm=(l+r)/2;
build(l,m,rt*2);
build(m+1,r,rt*2+1);
pushup(rt);
}void pushdown(int rt,int ln,int rn)//下推add延遲資訊,該節點的資訊已更新
}void update(int l,int r,ll c,int l,int r,int rt)//a[l]+=c
intm=(l+r)/2;
pushdown(rt,m-l+1,r-m);
if(l<=m)update(l,r,c,l,m,rt*2);
if(r>m) update(l,r,c,m+1,r,rt*2+1);
pushup(rt);
}ll query(int l,int r,int l,int r,int rt)
pushdown(rt,m-l+1,r-m);//在將要查詢該區間的子區間的時候下推add延遲資訊
if(l<=m)ans+=query(l,r,l,m,rt*2);
if(r>m) ans+=query(l,r,m+1,r,rt*2+1);
return ans;
}int main()
build(1,n,1);
for(int i=1;i<=m;i++)
else}}
}
poj3468線段樹區間修改
題目哈。最近在隊裡的寒假作業中第一次遇到了線段樹的題,之前也聽思雨姐姐說過也看過她寫過,但自己始終沒個影響,然後自己做了幾天也算剛入這個門,會寫一些比較基礎的線段樹了,之所以把這道題寫下來是因為線段樹的精華還是在於區間修改,也是最實用的部分。線段樹的區間修改,最巧妙的部分是建立乙個lazy樹,與各個...
POJ 3468 線段樹區間
這個題目是第二個區間修改的線段樹了,做到現在可以發現線段樹真的非常的靈活,特別是區間修改部分,前面的單點修改其實還是也可參看模版的,區間修改就真的非常靈活了了。這個題目就是區間加法,然後求乙個累加和,同樣地也是需要乙個延遲標誌的,也就是lazy,然後還需要乙個統計當前區間的全部和的陣列。就可以輕鬆解...
POJ 3468 線段樹區間修改,區間求和
由於是區間求和,因此我們在更新某個節點的時候,需要往上更新節點資訊,也就有了tree root val tree l root val tree r root val 但是我們為了把懶標記打上,當節點表示的區間是完全被詢問區間包含,那麼這個區間的資訊都是有用的,因此我們其實只需要把這個節點更新,並打...