nyoj119士兵殺敵(三)

2021-06-27 14:11:38 字數 2040 閱讀 9917

時間限制:

2000 ms  |  記憶體限制:

65535 kb

難度:5 描述

南將軍統率著n個士兵,士兵分別編號為1~n,南將軍經常愛拿某一段編號內殺敵數最高的人與殺敵數最低的人進行比較,計算出兩個人的殺敵數差值,用這種方法一方面能鼓舞殺敵數高的人,另一方面也算是批評殺敵數低的人,起到了很好的效果。

所以,南將軍經常問軍師小工第i號士兵到第j號士兵中,殺敵數最高的人與殺敵數最低的人之間軍功差值是多少。

現在,請你寫乙個程式,幫小工回答南將軍每次的詢問吧。

注意,南將軍可能詢問很多次。

輸入

只有一組測試資料

第一行是兩個整數n,q,其中n表示士兵的總數。q表示南將軍詢問的次數。(1

輸出對於每次詢問,輸出第m號士兵到第n號士兵之間所有士兵殺敵數的最大值與最小值的差。

樣例輸入

5 2

1 2 6 9 3

1 22 4

樣例輸出

1

線段樹解決的問題,每次節點推上去的是兩個節點之間的最大或者最小值。

開始的時候天真的用樹狀陣列做了一下,果斷超時。。

超時**:(不知道有木有人和我一樣超時的也貼出來 *~* 就是這麼倔強)

#include #include int dangdang[1000002];

int n;

int fun1(int num)

void fun2(int i, int num)

return sum;

}int main()

while(q--)

printf("%d\n", max-min);

}return 0;

}

ac**:

#include #include using namespace std;

#define lson l , m , rt << 1

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

#define inf 10000000

const int num = 222222;

int max[2100005];

int min[2100005];

int num1, num2;

void pushup(int rt)

void pushupl(int rt)

void build(int l,int r,int rt)

int m = (l + r) >> 1; //m = (l+r)/2

build(lson); //´« l, m, rt*2

build(rson); //´« m+1, r, rt*2+1

pushup(rt);

pushupl(rt);

}void query(int l,int r,int l,int r,int rt)

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

if (l <= m)

query(l , r , lson);

if (r > m)

query(l , r , rson);

}int main()

}return 0;

}

最優**:(還是好短)

#include#include#includeusing namespace std;

const int max=100010;

int fmax[max][20],fmin[max][20];

int main()

for(int i=1;i!=20;i++)

for(int j=1;j<=n;j++)

if(j+(1<

NYOJ119 士兵殺敵(三)

題目分析 這道題用的rmq演算法 range maximum minimum query 這裡做了幾點優化。1 定義dpmax和dpmin時,為什麼17寫在前面,因為記憶體中資料是按行連續的存的,所以初始化dpmax 0 和dpmin 0 相關資料時,可以直接用memcpy。2 所有的求2的方冪的操...

NYOJ 119士兵殺敵(三)

時間限制 2000 ms 記憶體限制 65535 kb 難度 5 描述 南將軍統率著n個士兵,士兵分別編號為1 n,南將軍經常愛拿某一段編號內殺敵數最高的人與殺敵數最低的人進行比較,計算出兩個人的殺敵數差值,用這種方法一方面能鼓舞殺敵數高的人,另一方面也算是批評殺敵數低的人,起到了很好的效果。所以,...

NYOJ 119 士兵殺敵(三)

士兵殺敵 三 時間限制 2000 ms 記憶體限制 65535 kb 難度 5 描述 南將軍統率著n個士兵,士兵分別編號為1 n,南將軍經常愛拿某一段編號內殺敵數最高的人與殺敵數最低的人進行比較,計算出兩個人的殺敵數差值,用這種方法一方面能鼓舞殺敵數高的人,另一方面也算是批評殺敵數低的人,起到了很好...