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