poj 3468 線段樹成段增減 區間求和

2021-07-04 16:27:37 字數 2079 閱讀 9371

給出了乙個序列,你需要處理如下兩種詢問。

"c a b c"表示給[a, b]區間中的值全部增加c (-10000≤ c ≤ 10000)。

"q a b" 詢問[a, b]區間中所有值的和。

input

第一行包含兩個整數n,q。1≤ n,q ≤ 100000.

第二行包含n個整數,表示初始的序列a (-1000000000≤ ai ≤1000000000)。

接下來q行詢問,格式如題目描述。

output

對於每乙個q開頭的詢問,你需要輸出相應的答案,每個答案一行。

sample input

10 5

1 2 3 4 5 6 7 8 9 10

q 4 4

q 1 10

q 2 4

c 3 6 3

q 2 4

sample output

4559

15分析:這題不能修改後就更新節點,而是用mark標記,如果下次查詢的區間包含mark!=0的區間再加上,別忘了重置mark為0

做了兩道節點樹的題,然後來寫這道 ,悲劇的是除錯了一天,最終還是無語的搜題解了,不過收穫還是挺大的,其實自己寫的也差不多了

/*以前的#include#include#include#include#includeusing namespace std;

const int maxn=1000010;

typedef long long ll;

struct nodetree[maxn<<2];

int a[maxn];

void build(int ll,int rr,int rt)

int mid=(ll+rr)>>1;

build(ll,mid,rt<<1);

build(mid+1,rr,rt<<1|1);

tree[rt].sum=(tree[rt<<1].sum+tree[rt<<1|1].sum);

}void update(int ll,int rr,int rt,int val)

tree[rt].sum+=(ll)val*(rr-ll+1);

if(tree[rt].mid>=rr)

update(ll,rr,rt<<1,val);

else if(tree[rt].mid=rr) return query(ll,rr,rt<<1);

else if(tree[rt].mid#include#includeusing namespace std;

#define lson l,m,rt<<1

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

const int n=1e5+5;

typedef long long ll;

ll sum[n<<2],col[n<<2];

void pushup(int rt)

void pushdown(int rt,int m)

}void build(int l,int r,int rt)

int m=(l+r)>>1;

build(lson);

build(rson);

pushup(rt);

}void update(int a,int b,int c,int l,int r,int rt)

pushdown(rt,r-l+1);

int m=(l+r)>>1;

if(a<=m)update(a,b,c,lson);

if(b>m)update(a,b,c,rson);

pushup(rt);

}ll query(int a,int b,int l,int r,int rt)

pushdown(rt,r-l+1);

int m=(l+r)>>1;

ll ans=0;

if(a<=m)ans+=query(a,b,lson);

if(b>m)ans+=query(a,b,rson);

return ans;

}int main()

else

}return 0;

}

POJ 3468 線段樹成段更新

題意就是給了一串行的數.然後不斷的問一段的值或者在一段上每個數加乙個數.輸出每次詢問的值.初看這題感覺就是最一般的線段樹成段更新的應用.但下手後發現很多細節.對於一向很粗心的我調了很久才給調出來.成段更新前一文已經提到過.這裡再通過這一題補充一些很值得注意的地方 1 前乙個題因為只有最後才要輸出一段...

POJ 3468 線段樹成段更新

很久以前的題目再做一遍複習一下。要點 1 約定在任何時候 add num 到達節點的時候就立即更新節點的 sum 值。2 每次更新節點回溯的時候記得維護節點的 sum 值。3 執行詢問操作的時候,遇到 lazy 標記為1 的時候往下 push down,同時記得第一點 4 遇到符合要求的詢問區間時,...

poj 3468線段樹 成段更新

題意和題目都很簡單,就是線段樹的成段更新,只要做一下延遲標記就好了。題意 查詢一段數的和,和更新一段數的值。一開始出了點錯誤,忘在更新時做延遲標記了。includelong long sum 100010 2 long long add 100010 2 void push up int rt vo...