通過這道題還是又進一步對線段樹有了更深的認識,加油加油!
借郭老師的分析:
本題樹節點要存哪些資訊?只存該區間的數的和,行不行?只存和,會導致每次加數的時候都要更新到葉子節點,速度太慢,這是必須要避免的。
本題樹節點結構:
struct node ; //本節點區間的和實際上是sum+inc*(r-l+1)
在增加時,如果要加的區間正好覆蓋乙個節點,則增加其節點的inc值,不再往下走,否則要更新sum,再將增量往下傳在查詢時,如果待查區間不是正好覆蓋乙個節點,就將 節點的inc往下帶,然後將inc代表的所有增量累加到sum上後將inc清0,接下來再往下查詢。
#includeusing
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...