乙個長度為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 炮彈會被擋住並落在...