題目哈。。
最近在隊裡的寒假作業中第一次遇到了線段樹的題,之前也聽思雨姐姐說過也看過她寫過,但自己始終沒個影響,然後自己做了幾天也算剛入這個門,會寫一些比較基礎的線段樹了,之所以把這道題寫下來是因為線段樹的精華還是在於區間修改,也是最實用的部分。
線段樹的區間修改,最巧妙的部分是建立乙個lazy樹,與各個點相對應不用再一一處理而是先輸出等後面遇到再加上(個人理解),lazy就是懶的意思,其實也就是個標記,標記如果有值加上就可以。這個時候就需要乙個pushdown的操作就可以了。
還有個技巧 我們平常用乘二除二都是*2 /2 大神們更習慣<<2 >>2 據說因為更靠近機器語言所以更快,在以後的刷題生活中也要自己慢慢習慣這種寫法
#include #include#include#includeusing namespace std;
const int manx=100000+200;
long long tree[manx*4];
long long laze[manx*4];
void pushup(long long node)
void pushdown(long long node,long long k)
}void build(long long node,long long begin,long long end)
int mid=(begin+end)/2;
build(node*2,begin,mid);
build(node*2+1,mid+1,end);
pushup(node);
return;
}long long query(long long node,long long begin,long long end,long long left,long right)
pushdown(node,end-begin+1);
long long ans=0,mid=(begin+end)/2;
if(mid>=left)
ans+=query(node*2,begin,mid,left,right);
if(right>mid)
ans+=query(node*2+1,mid+1,end,left,right);
return ans;
}void update(long long node,long long begin,long long end,long long left,long long right,long long t)
pushdown(node,end-begin+1);
long long mid=(begin+end)/2;
if(mid>=left)
update(node*2,begin,mid,left,right,t);
if(right>mid)
update(node*2+1,mid+1,end,left,right,t);
pushup(node);
}int main()
else
}return 0;
}
POJ 3468 線段樹區間
這個題目是第二個區間修改的線段樹了,做到現在可以發現線段樹真的非常的靈活,特別是區間修改部分,前面的單點修改其實還是也可參看模版的,區間修改就真的非常靈活了了。這個題目就是區間加法,然後求乙個累加和,同樣地也是需要乙個延遲標誌的,也就是lazy,然後還需要乙個統計當前區間的全部和的陣列。就可以輕鬆解...
POJ 3468 線段樹區間修改,區間求和
由於是區間求和,因此我們在更新某個節點的時候,需要往上更新節點資訊,也就有了tree root val tree l root val tree r root val 但是我們為了把懶標記打上,當節點表示的區間是完全被詢問區間包含,那麼這個區間的資訊都是有用的,因此我們其實只需要把這個節點更新,並打...
POJ 3468(線段樹區間修改模板題)
poj3468鏈結 給出兩個操作 1 將乙個區間裡的都數增加c 2 查詢區間 a,b 內的和 線段樹的區間修改和點修改相比多了乙個add陣列,add陣列的作用是在進行區間更新的時候不必將和該區間有關的所有線段都更新,某個線段的add陣列的含義是 該線段的子線段的sum值都應該增加add 該線段的su...