牛客網 剩下的樹 線段樹入門

2021-10-05 06:20:35 字數 1914 閱讀 7642

(mn

)o(mn)

o(mn

)複雜度都可以過,可以見得資料之水當然這道題的資料量本身也是符合這個複雜度的,

ps:fill和memset別用得太多,有時候會被卡死

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

#define ll int

#define max 10005

#define inf 0x3fffff

ll arr[max]

;int

main()

ll res =0;

for(

int i =

0; i <= l; i++

)res +

= arr[i]

; cout << res << endl;}}

但是如果n

=100000

n=100000

n=1000

00,m

=10000

m=10000

m=1000

0?還能水過嘛,顯然不能,對於區間查詢,區間修改,最好的方式即線段樹。這道題的線段樹更新也比較簡單,具體還是看

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

#define ll int

#define max 10005

#define inf 0x3fffff

ll t[max *4]

, tag[max *4]

;inline ll lc

(ll k)

inline ll rc

(ll k)

void

pushupsum

(ll p)

void

build

(ll p, ll l, ll r)

ll mid =

(l + r)

>>1;

build(lc

(p), l, mid)

;build(rc

(p), mid +

1, r)

;pushupsum

(p);

}inline

void

f(ll p, ll l, ll r, ll k)

inline

void

pushdown

(ll p, ll l, ll r)

inline

void

update

(ll nl, ll nr, ll l, ll r, ll p, ll k =-1

)if(tag[p]==-

1)pushdown

(p, l, r)

; ll mid =

(l + r)

>>1;

if(nl <= mid)

update

(nl, nr, l, mid,

lc(p));

if(nr > mid)

update

(nl, nr, mid +

1, r,

rc(p));

pushupsum

(p);

}int

main()

cout << t[1]

<< endl;

}}

牛客網 剩下的樹

題目描述 有乙個長度為整數l 1 l 10000 的馬路,可以想象成數軸上長度為l的乙個線段,起點是座標原點,在每個整數座標點有一棵樹,即在0,1,2,l共l 1個位置上有l 1棵樹。現在要移走一些樹,移走的樹的區間用一對數字表示,如 100 200表示移走從100到200之間 包括端點 所有的樹。...

牛客 FBI樹(線段樹 後續遍歷)

我這種方法不是最簡單的方法,不過我覺得比較好理解 題意 給出乙個01字串,每次從中間折取建成乙個二叉樹,若子樹都是0則是b樹,都是1則是i樹,否則為f樹,求出該樹的後續遍歷 思路 首先我想到的是這個建樹過程和線段樹很像,每個節點儲存的是以該點為根的什麼樣的樹,0代表b樹,1代表i樹,2代表f樹。接著...

牛客網 sequence 線段樹 單調棧

官方題解 假設a中的元素互不相同,我們考慮a中的某個元素作為min的時刻。對於每個a i 我們找到左邊第乙個比它大的元素a l 右邊第乙個比它大的a r 那麼左端點在 l 1,i 右端點在 i,r 1 的區間min就為它。求l和r可以使用單調棧。考慮如何求某個a i 作為min的答案。如果a i 0...