POJ 3468《線段樹,區間add

2021-07-15 15:31:41 字數 1310 閱讀 2779

題目連線

//位運算

k<<1 相當於 k*2

k<<1

|1 相當於 k*2+1

/*

修改區間內的值,並且維護區間和。

詳見**

*/#include

#include

#include

using

namespace

std;

typedef

long

long ll;

const

int maxn=100000+10;

int a[maxn];

struct tree

f[maxn*4];

void bulid(int i,int l,int r)//maketree

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

bulid(i<<1, l, mid);

bulid(i<<1|1, mid+1, r);

f[i].sum=f[i<<1].sum+f[i<<1|1].sum;//維護和

}void add(int i,int a,int b,ll c)

//區間不重合,更新當前區間的sum,pushdown

f[i].sum+=c*(b-a+1);

int mid=(f[i].l+f[i].r)>>1;

if(b<=mid)

add(i<<1, a, b, c);

else

if(a>=mid+1)

add(i<<1|1, a, b, c);

else

}ll query(int i,int a,int b)//查詢

f[i].sum+=(f[i].r-f[i].l+1)*f[i].inc;//相當於pushdown

int mid=(f[i].l+f[i].r)>>1;

add(i<<1, f[i].l, mid, f[i].inc);

add(i<<1|1,mid+1,f[i].r,f[i].inc);

f[i].inc=0;

if(b<=mid)

return query(i<<1, a, b);

else

if(a>=mid+1) return query(i<<1|1, a, b);

else

return query(i<<1, a, mid)+query(i<<1|1, mid+1,b);

}int main ()

else}}

return

0;}

POJ 3468 線段樹區間

這個題目是第二個區間修改的線段樹了,做到現在可以發現線段樹真的非常的靈活,特別是區間修改部分,前面的單點修改其實還是也可參看模版的,區間修改就真的非常靈活了了。這個題目就是區間加法,然後求乙個累加和,同樣地也是需要乙個延遲標誌的,也就是lazy,然後還需要乙個統計當前區間的全部和的陣列。就可以輕鬆解...

poj3468線段樹區間修改

題目哈。最近在隊裡的寒假作業中第一次遇到了線段樹的題,之前也聽思雨姐姐說過也看過她寫過,但自己始終沒個影響,然後自己做了幾天也算剛入這個門,會寫一些比較基礎的線段樹了,之所以把這道題寫下來是因為線段樹的精華還是在於區間修改,也是最實用的部分。線段樹的區間修改,最巧妙的部分是建立乙個lazy樹,與各個...

POJ 3468 線段樹區間修改,區間求和

由於是區間求和,因此我們在更新某個節點的時候,需要往上更新節點資訊,也就有了tree root val tree l root val tree r root val 但是我們為了把懶標記打上,當節點表示的區間是完全被詢問區間包含,那麼這個區間的資訊都是有用的,因此我們其實只需要把這個節點更新,並打...