51NOD 1287 加農炮(不水的線段樹)

2022-05-01 13:27:10 字數 1497 閱讀 1943

》點選進入原題測試《

input示例911

1204

3215

7280

7653

4565

output示例22

2433567

思路:剛開始以為結點存最大值就行了,然後大於左子樹的最大值就能進入右子樹;然後發現樣例都過不了;後面發現,並不是這個樣子,假如這個數小於等於右孩子最左邊那個數的話,也不能進入有孩子,所以結點還得儲存右孩子最左邊的那個值;同時更新乙個最大值,當輸入值鹹魚等於a[0]或者大於最大值時跳過。

#include#include

#include

using

namespace

std;

#define lson l,m,rt<<1

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

#define ll long long

const

int maxn = 5e4 + 5

;ll tree[maxn

<< 2], mtree[maxn << 2

], a[maxn];

ll ma =int_min;

void build(int l, int r, int

rt)

int m = (l + r) >> 1

; build(lson);

build(rson);

tree[rt] = max(tree[rt << 1], tree[rt << 1 | 1

]); mtree[rt] = mtree[rt << 1];}

void update(int x, int l, int r, int

rt)

int m = (l + r) >> 1

;

if (tree[rt << 1] < x&&x>mtree[rt << 1 | 1

])

update(x, rson);

else

update(x, lson);

tree[rt] = max(tree[rt << 1], tree[rt << 1 | 1

]); mtree[rt] = mtree[rt << 1];}

void print(int l, int r, int

rt) cout

<< rt << "= "

<< tree[rt] <

int m = (r + l) >> 1

;

if (l <=m)print(lson);

if (r >m)print(rson);

}int

main()

build(

1, m, 1

);

inttemp;

while (n--)

for (int i = 1; i <= m; i++)

}

51nod1287 加農炮 線段樹

乙個長度為m的正整數陣列a,表示從左向右的地形高度。測試一種加農炮,炮彈平行於地面從左向右飛行,高度為h,如果某處地形的高度大於等於炮彈飛行的高度h a i h 炮彈會被擋住並落在i 1處,則a i 1 1。如果h a 0 則這個炮彈無效,如果h 所有的a i 這個炮彈也無效。現在給定n個整數的陣列...

51nod 1287 加農炮 好題啊好題

1287 加農炮 codility 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 乙個長度為m的正整數陣列a,表示從左向右的地形高度。測試一種加農炮,炮彈平行於地面從左向右飛行,高度為h,如果某處地形的高度大於等於炮彈飛行的高度h a i h 炮彈會被擋住並落在...

51NOD1287 加農炮 二分 預處理

51nod1287加農炮 題意 就是給你n個山,每個山的高度為h i 有m發炮彈,每發炮彈的高度為b i 每次炮彈只能打中 b i 的第一座山脈,並使這座山的前乙個刪高度上公升1,問m發炮彈之後每座山的高度 做法 這道題有乙個想法如果想到了就很好做,就是後面的山比前面矮的話就是沒用的,所以我們只要用...