POJ 3468 還是線段樹的

2022-03-12 14:18:45 字數 1232 閱讀 9901

通過這道題還是又進一步對線段樹有了更深的認識,加油加油!

借郭老師的分析:

本題樹節點要存哪些資訊?只存該區間的數的和,行不行?只存和,會導致每次加數的時候都要更新到葉子節點,速度太慢,這是必須要避免的。

本題樹節點結構:

struct node ; //本節點區間的和實際上是sum+inc*(r-l+1)

在增加時,如果要加的區間正好覆蓋乙個節點,則增加其節點的inc值,不再往下走,否則要更新sum,再將增量往下傳在查詢時,如果待查區間不是正好覆蓋乙個節點,就將   節點的inc往下帶,然後將inc代表的所有增量累加到sum上後將inc清0,接下來再往下查詢。

#include 

using

namespace std;

struct nodenode[400000];

int ncount=0;

void create(int l,int r,node *proot)

void insert(node *proot,int i,int v)

proot->sum+=v;

if(i>=proot->mid+1)

else

}void add(node *proot,int l,int r,int v)

proot->sum+=v*(r-l+1);

if(l>=proot->mid+1)

else

if(r<=proot->mid)

else

}long

long getsum(int l,int r,node *proot)

proot->sum+=(proot->r-proot->l+1)*proot->inc; //

之前的add()到這就滿足條件,結束了。我在這被卡了好久。主要是對線段樹的操作還不時很熟練。

add(proot->pleft,proot->l,proot->mid,proot->inc);

add(proot->pright,proot->mid+1,proot->r,proot->inc);

proot->inc=0; //

到此就把inc向下推了一級

if(l>=proot->mid+1)

else

if(r<=proot->mid)

else

}int main()

for(i=1;i<=q;i++)

else

}return

0;}

poj3468之線段樹

include include include include include include include include include define inf 99999999 using namespace std const int max 100000 10 int64 sum max ...

POJ 3468 線段樹區間

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

poj 3468 線段樹lazy操作

題意 區間每個數加上乙個數,詢問乙個區間之和.include include include include include include include include include define ll long long define ls rt 1 define rs rt 1 1 def...