時間限制:
2000 ms | 記憶體限制:
65535 kb
難度:5描述
南將軍統率著n個士兵,士兵分別編號為1~n,南將軍經常愛拿某一段編號內殺敵數最高的人與殺敵數最低的人進行比較,計算出兩個人的殺敵數差值,用這種方法一方面能鼓舞殺敵數高的人,另一方面也算是批評殺敵數低的人,起到了很好的效果。
所以,南將軍經常問軍師小工第i號士兵到第j號士兵中,殺敵數最高的人與殺敵數最低的人之間軍功差值是多少。
現在,請你寫乙個程式,幫小工回答南將軍每次的詢問吧。
注意,南將軍可能詢問很多次。輸入
只有一組測試資料
第一行是兩個整數n,q,其中n表示士兵的總數。q表示南將軍詢問的次數。(1
輸出對於每次詢問,輸出第m號士兵到第n號士兵之間所有士兵殺敵數的最大值與最小值的差。
樣例輸入
5 21 2 6 9 31 22 4
樣例輸出
17
#include
#include
#include
using namespace std;
struct max//記錄最大最小
;
struct tree
map1[440000];
int a[100005];//記錄每個士兵殺的人數。
void builer(int l,int r,int q)//建樹
int mid=(l+r)/2;
builer(l,mid,q*2);
builer(mid+1,r,q*2+1);
}
void shangfu(int l,int r,int q)//上浮
int mid=(l+r)/2;
shangfu(l,mid,q*2);
shangfu(mid+1,r,q*2+1);
map1[q].num.max1=max(map1[q*2].num.max1,map1[q*2+1].num.max1);//當前節點的最大最小值是從左右子樹求出來的。
map1[q].num.min1=min(map1[q*2].num.min1,map1[q*2+1].num.min1);
}
max find1(int l,int r,int q)
else if(r<=map1[q*2].r)//區間[l,r]區間屬於左子樹。
else if(l>=map1[q*2+1].l) //區間[l,r]區間屬於右子樹
else//區間[l,r]屬於左右子樹
}
int main()
int b,c;
builer(1,m,1);//建樹
shangfu(1,m,1);
for(int i=0;i}
士兵殺敵(三)(線段樹)
時間限制 2000 ms 記憶體限制 65535 kb 難度 5 描述 南將軍統率著n個士兵,士兵分別編號為1 n,南將軍經常愛拿某一段編號內殺敵數最高的人與殺敵數最低的人進行比較,計算出兩個人的殺敵數差值,用這種方法一方面能鼓舞殺敵數高的人,另一方面也算是批評殺敵數低的人,起到了很好的效果。所以,...
NYOJ 119 士兵殺敵(三)(線段樹)
士兵殺敵 三 時間限制 2000 ms 記憶體限制 65535 kb 難度 5 描述 南將軍統率著n個士兵,士兵分別編號為1 n,南將軍經常愛拿某一段編號內殺敵數最高的人與殺敵數最低的人進行比較,計算出兩個人的殺敵數差值,用這種方法一方面能鼓舞殺敵數高的人,另一方面也算是批評殺敵數低的人,起到了很好...
NYOJ119 士兵殺敵(三) 線段樹
時間限制 2000 ms 記憶體限制 65535 kb 難度 5 描述 南將軍統率著n個士兵,士兵分別編號為1 n,南將軍經常愛拿某一段編號內殺敵數最高的人與殺敵數最低的人進行比較,計算出兩個人的殺敵數差值,用這種方法一方面能鼓舞殺敵數高的人,另一方面也算是批評殺敵數低的人,起到了很好的效果。所以,...