1287 加農炮
codility
基準時間限制:1 秒 空間限制:131072 kb 分值: 40
難度:4級演算法題
乙個長度為m的正整數陣列a,表示從左向右的地形高度。測試一種加農炮,炮彈平行於地面從左向右飛行,高度為h,如果某處地形的高度大於等於炮彈飛行的高度h(a[i] >= h),炮彈會被擋住並落在i - 1處,則a[i - 1] + 1。如果h <= a[0],則這個炮彈無效,如果h > 所有的a[i],這個炮彈也無效。現在給定n個整數的陣列b代表炮彈高度,計算出最後地形的樣子。
例如:地形高度a = , 炮彈高度b = ,最終得到的地形高度為:。
input
第1行:2個數m, n中間用空格分隔,分別為陣列a和b的長度(1 <= m, n <= 50000)output第2至m + 1行:每行1個數,表示對應的地形高度(0 <= a[i] <= 1000000)。
第m + 2至n + m + 1行,每行1個數,表示炮彈的高度(0 <= b[i] <= 1000000)。
輸出共m行,每行乙個數,對應最終的地形高度。input示例
9 1112output示例0432
1572
8076
5345
65
222最開始自己的思路是用剛學的線段樹來做,但是問題在於更新這塊自己還不是很熟練,就是乙個炮彈打過來,某地高度+1,這樣的話我自己現在的方法只能是更新整個的線段樹,一直到最小節點上。所以估計時間會超時,這個思路out。4335
67
然後自己的思路是記錄整個地方的高地。就是,記錄1 2 4 5 7。然後炮彈打過來不斷更新這個高地陣列。過了19個用例,其中乙個死活過不了。。。後來想自己更新這個也不對啊,中間會產生高地,比方說2 2 5,乙個炮彈4的打過來,高地原來是2 5,現在就得是 2 3 5了。。。還是麻煩。
最後,還是老實用二分找炮彈打過來的高地,將其之前的土地高度+1,然後更新高地高度。
**:
#include #include #include #include #include #include #pragma warning(disable:4996)
using namespace std;
int canno[1000003];
int highet[1000003];
int a,b;
int main()
int count=0;
for(i=1;i<=b;i++)
for(i=1;i<=a;i++)
return 0;
}
51nod1287 加農炮 線段樹
乙個長度為m的正整數陣列a,表示從左向右的地形高度。測試一種加農炮,炮彈平行於地面從左向右飛行,高度為h,如果某處地形的高度大於等於炮彈飛行的高度h a i h 炮彈會被擋住並落在i 1處,則a i 1 1。如果h a 0 則這個炮彈無效,如果h 所有的a i 這個炮彈也無效。現在給定n個整數的陣列...
51NOD1287 加農炮 二分 預處理
51nod1287加農炮 題意 就是給你n個山,每個山的高度為h i 有m發炮彈,每發炮彈的高度為b i 每次炮彈只能打中 b i 的第一座山脈,並使這座山的前乙個刪高度上公升1,問m發炮彈之後每座山的高度 做法 這道題有乙個想法如果想到了就很好做,就是後面的山比前面矮的話就是沒用的,所以我們只要用...
51NOD 1287 加農炮(不水的線段樹)
點選進入原題測試 input示例911 1204 3215 7280 7653 4565 output示例22 2433567 思路 剛開始以為結點存最大值就行了,然後大於左子樹的最大值就能進入右子樹 然後發現樣例都過不了 後面發現,並不是這個樣子,假如這個數小於等於右孩子最左邊那個數的話,也不能進...