線段樹 nyoj 備用 2344 蓋倫的告白

2021-08-04 14:26:20 字數 1289 閱讀 9791

時間限制: 1 sec  

記憶體限制: 128 mb

提交: 44  

解決: 16 [

提交][

狀態][

討論版]

蓋倫和趙信這對**又在打賭,誰輸了就去向卡特琳娜告白。。

這一季中蓋倫一如既往的慫。趙信為了幫他一把,故意表現出很厲害的樣子,結果成功啟用了蓋倫的智商。

趙信手中有n張牌,每張牌上面有乙個數,這些牌是非遞減的。現在蓋倫從他手中抽取k張牌,如果蓋倫抽取後剩下的牌中相鄰兩張的差值的最大值最小,就算他贏。

結果當然是蓋倫贏了。那麼問題來了!

第一行兩個正整數n和k。

第二行n個數代表n張牌。

3≤n≤10

51≤k≤n-2

-109≤a

i≤109

輸出只有乙個數,上述中的最小值。

5 1

1 2 4 7 8

8 21 2 3 5 8 13 17 18

5 11 2 4 6 9

3

52

題意:有一非遞減序列a,要隨意抽掉k個數字,剩下n-k個數為序列b,問序列b的相鄰元素的差值最大值,最小是多少。

思路:我剛看到這題就想著什麼最大值最小化,確實是啊,但是不是用二分的;先思考給定的序列為非遞減序列,那麼相鄰的元素之間的差才會更小,如果從中間去掉的話,就會擴大相鄰兩數之間的差值,所以最優是一次抽掉的k個數是相連的;我們再求剩下的區間的相鄰元素差(預處理)的最大值,然後對最大值比較取最小,最後得到的minn就是最小值了;多組資料輸入,在這兒wa了好幾發;

**:

#include#include#includeusing namespace std;

const int n=100005;

const int inf=1000000007;

int a[n];

struct node

} tree[n<<2];

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

int m=tree[rt].mid();

buildtree(l,m,rt<<1);

buildtree(m+1,r,rt<<1|1);

tree[rt].val=max(tree[rt<<1].val,tree[rt<<1|1].val);

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

int main()

printf("%d\n",minn);

}return 0;

}

nyoj 士兵殺敵(一) 108 (線段樹)

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 南將軍手下有n個士兵,分別編號1到n,這些士兵的殺敵數都是已知的。小工是南將軍手下的軍師,南將軍現在想知道第m號到第n號士兵的總殺敵數,請你幫助小工來回答南將軍吧。注意,南將軍可能會問很多次問題。輸入 只有一組測試資料 第一行是...

NYOJ116 線段樹 樹狀陣列

題目傳送門 戳一戳 注意陣列大小,一般我們用線段樹,都開四倍空間。但是這道題資料量是一百萬,四倍開不了 所以我們就不能開四倍,而要計算一下空間,避免浪費。計算方法就是 1000000 找到2的n次方剛好大於一百萬的那個數 就是2的20次方是1048576 然後再拿1048576 x 2 209715...

nyoj 最大最小值 1185 線段樹

時間限制 1000 ms 記憶體限制 65535 kb 難度 2 描述 給出n個整數,執行m次詢問。對於每次詢問,首先輸入三個整數c l r 如果c等於1,輸出第l個數到第r個數之間的最小值 如果c等於2,輸出第l個數到第r個數之間的最大值 如果c等於3,輸出第l個數到第r個數之間的最小值與最大值的...