poj 3468 線段樹lazy操作

2021-06-08 20:59:43 字數 1139 閱讀 7467

題意: 區間每個數加上乙個數,詢問乙個區間之和.

#include #include #include #include #include #include #include #include #include #define ll long long

#define ls rt<<1

#define rs rt<<1|1

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

#define make_m int m=(l+r)/2;

using namespace std;

const ll n=100005;

struct node

tree[n*4];

ll n,q;

void up(ll rt)

void down(ll rt,ll c)

}void built(ll l,ll r,ll rt)

make_m;

built(lson);

built(rson);

up(rt);

}void update(ll l,ll r,ll c,ll rt)

down(rt,r-l+1);

make_m;

if(l<=m)

update(l,r,c,ls);

if(r>m)

update(l,r,c,rs);

up(rt);

}ll query(ll l,ll r,ll rt)

make_m;

down(rt,r-l+1);

ll ans=0;

if(l<=m)

ans+=query(l,r,ls);

if(r>m)

ans+=query(l,r,rs);

return ans;

}int main()

{ ll l,r,c;

char ch[20];

scanf("%lld%lld",&n,&q);

built(1,n,1);

while(q--)

{scanf("%s",ch);

if(ch[0]=='q')

scanf("%lld%lld",&l,&r), cout<

poj 3468 線段樹 lazy思想

思路 如果直接去做,每次都更新到葉子節點,那必然會tle,我們可以採用lazy的思想 沒必要每次更新都更新到葉子節點,只要有乙個合適的範圍就用乙個增量來記錄它,當下一次詢問時,如果這個範圍正好合適詢問的範圍,就直接是這個節點的sum值加上這個區間長度 lnc,再加到總和上去,若這個節點的範圍不適合所...

poj 3468 線段樹 lazy思想

思路 如果直接去做,每次都更新到葉子節點,那必然會tle,我們可以採用lazy的思想 沒必要每次更新都更新到葉子節點,只要有乙個合適的範圍就用乙個增量來記錄它,當下一次詢問時,如果這個範圍正好合適詢問的範圍,就直接是這個節點的sum值加上這個區間長度 lnc,再加到總和上去,若這個節點的範圍不適合所...

poj 3468 線段樹區間更新 lazy思想

題目大意 題目挺好理解的,就是給你一串數字,然後會在某一區間上,使區間的所有數字都加上乙個數,也就是更新這段區間的數字,最後再進行對某一區間的求值操作。題目分析 因為這道題目和我之前剛剛做的那道題目很類似,都是區間段更新的題目,但是有所不同的是,那個題目是直接賦值更新,而這個題目是區間進行加和,不是...