51nod1287 加農炮 線段樹

2021-08-11 20:26:18 字數 1437 閱讀 5256

乙個長度為m的正整數陣列a,表示從左向右的地形高度。測試一種加農炮,炮彈平行於地面從左向右飛行,高度為h,如果某處地形的高度大於等於炮彈飛行的高度h(a[i] >= h),炮彈會被擋住並落在i - 1處,則a[i - 1] + 1。如果h <= a[0],則這個炮彈無效,如果h > 所有的a[i],這個炮彈也無效。現在給定n個整數的陣列b代表炮彈高度,計算出最後地形的樣子。

例如:地形高度a = , 炮彈高度b = ,最終得到的地形高度為:。

第1行:2個數m, n中間用空格分隔,分別為陣列a和b的長度(1 <= m, n <= 50000)

第2至m + 1行:每行1個數,表示對應的地形高度(0 <= a[i] <= 1000000)。

第m + 2至n + m + 1行,每行1個數,表示炮彈的高度(0 <= b[i] <= 1000000)。

輸出共m行,每行乙個數,對應最終的地形高度。

刷水題有益身心健康,要是這題還能交我就前五十了

乙個很顯然的做法就是線段樹維護區間最大值,這樣是最好想的

另乙個思路就是在原高度陣列中找乙個最長上公升的子串行,然後每次二分,這樣比較好寫

#include 

#include

#define rep(i,st,ed) for (int i=st;i<=ed;++i)

#define max(x,y) ((x)>(y)?(x):(y))

#define n 60005

int mx[n<<2|1];

int n,m,st;

int read()

void buildtree(int now,int l,int r)

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

buildtree(now<<1,l,mid);

buildtree(now<<1|1,mid+1,r);

mx[now]=max(mx[now<<1],mx[now<<1|1]);

}void writeln(int now,int l,int r)

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

writeln(now<<1,l,mid);

writeln(now<<1|1,mid+1,r);

}void modify(int now,int tl,int tr,int x)

int mid=(tl+tr)>>1;

if (x<=mid) modify(now<<1,tl,mid,x);

else modify(now<<1|1,mid+1,tr,x);

mx[now]=max(mx[now<<1],mx[now<<1|1]);

}int query(int now,int tl,int tr,int v)

int main(void)

writeln(1,1,n);

return

0;}

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

點選進入原題測試 input示例911 1204 3215 7280 7653 4565 output示例22 2433567 思路 剛開始以為結點存最大值就行了,然後大於左子樹的最大值就能進入右子樹 然後發現樣例都過不了 後面發現,並不是這個樣子,假如這個數小於等於右孩子最左邊那個數的話,也不能進...

51nod 1287 加農炮(二分 線段樹)

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

51nod 1287 加農炮 好題啊好題

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