線段樹 (更新區間查詢點)秋實大哥與小朋友

2021-08-08 23:39:55 字數 1480 閱讀 1965

problem description

秋實大哥以賙濟天下,鋤強扶弱為己任,他常對天長嘆:安得廣廈千萬間,大庇天下寒士俱歡顏。

所以今天他又在給一群小朋友發糖吃。

他讓所有的小朋友排成一行,從左到右標號。在接下去的時間中,他有時會給一段區間的小朋友每顆糖,有時會問第x個小朋友手裡有幾顆糖。

這對於沒上過學的孩子來說實在太困難了,所以你看不下去了,請你幫助小朋友回答所有的詢問。

第一行包含兩個整數n,m,表示小朋友的個數,以及接下來你要處理的運算元。

接下來的mm行,每一行表示下面兩種操作之一:

0 l r v : 表示秋實大哥給[l,r]這個區間內的小朋友每人v顆糖

1 x : 表示秋實大哥想知道第x個小朋友手裡現在有幾顆糖 

1≤m,v≤100000,1≤l≤r≤n,1≤x≤n,1≤n≤100000000。

對於每乙個1 x操作,輸出乙個整數,表示第x個小朋友手裡現在的糖果數目。

3 4 

0 1 3 1 

1 2 

0 2 3 3 

1 31 4

**:

#include#includeusing namespace std;

typedef long long ll;

#define n 100000+10

#define lson l,m,rt<<1

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

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

struct node

}tree[n<<2];

void pushup(int rt)

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

int m=tree[rt].mid();

build(lson);

build(rson);

pushup(rt);//rt從大到小往上返

}void pushdown(int rt,int m)

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

pushdown(rt,tree[rt].r-tree[rt].l+1);

int m=tree[rt].mid();

ll res=0;

if(r<=m)

else if(l>m)

else

return res;

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

if(tree[rt].l==tree[rt].r)

pushdown(rt,tree[rt].r-tree[rt].l+1);

int m=tree[rt].mid();

if(r<=m)

else if(l>m)

else

pushup(rt);

}int main()

else}}

return 0;

}

線段樹 區間更新 區間查詢

題意 題解 如果採用單點更新的思路對區間進行更新的話時間複雜度會比較高,因此用了乙個lazy陣列 俗稱懶人標記 它為什麼叫懶人標記呢,比如更新的區間為 l,r z,而l到r覆蓋了線段樹某乙個節點的區間,那麼可以將該節點對應的lazy陣列的值加上z,同時更新該節點的值,這樣就可以避免更新它子孫節點的值...

uestcOJ秋實大哥與花 線段樹

秋實大哥是乙個儒雅之人,晝聽笙歌夜醉眠,若非月下即花前。所以秋實大哥精心照料了很多花朵。現在所有的花朵排成了一行,每朵花有乙個愉悅值。秋實大哥每天要對著某一段連續的花朵歌唱,然後這些花朵的愉悅值都會增加乙個相同的值vv vv可能為負 同時他想知道每次他唱完歌後這一段連續的花朵的愉悅值總和是多少。第一...

單點更新,區間查詢線段樹

線段樹的空間複雜度是4n include include include using namespace std const int maxn 100005 const int inf 0x3f3f3f3f int n,a maxn struct node 結點 tree maxn 4 樹結點儲存陣...