高手訓練 RMQ 奶牛排隊

2022-04-01 06:02:26 字數 1708 閱讀 8551

第一題由於過水,就沒寫awa

大概就是這樣了。

題意就是求乙個最長的區間使得區間的左邊是它的最小值,區間右邊是他的最大值

第乙個想法肯定是暴力列舉啦awa

但是這個是o(n^3)的,絕對的不可過awa

思考性質awa

發現我們列舉每個區間的左右端點,其實有大量的不合法的計算的

也就是沒有用的列舉。

考慮怎麼避開不合法區間的列舉。

那麼就不要先考慮區間的範圍。

先考慮合法性,也就是直接尋找符合條件的區間

考慮區間合法滿足的條件。

首先,在乙個區間中肯定是要滿足最大值的位置max要在最小值的位置min後面的,即使max>min

可以發現,如果這個是存在的話,答案肯定是要嘗試更新的。

如果不能更新的話,那麼這個區間不代表就沒有答案了。

所以我們還需要考慮一下在**會有答案。

對於乙個max

其中的max和min的位置就是最大值和最小值的位置。

因為max在min的後面,所以這整個大區間就不可能會有答案。

所以我們就用max為右邊界,min為左邊界,再次分割出兩個區間。

這就是區間1和3的由來。

區間2是剩下的。

awa然後對於中間有解的情況

就是這樣的

其中的區間2是已經有解的了,所以我們頂著min和max再次分割出兩個區間。

就是區間1和3.

然後進行遞迴,就是答案了。

為了快速的統計最大值和最小值以及他們的位置,我們就用st表(這非常的顯而易見)

然後就沒了。

awacode

#include#define ll long long

using

namespace

std;

ll n,m,a[

100001

];ll maxn[

100001][27],b[100001][27

];ll minn[

100001][27],c[100001][27

];ll ans,logn[

100001

];inline ll read()

void

get_maxx(ll x,ll y)//為了記錄最大值和最小值的位置而被魔改的轉移

else

}void

get_minn(ll x,ll y)

else

}ll gax(ll l,ll r)

ll gin(ll l,ll r)

void

find(ll l,ll r)

else

//x>y

}

}int

main()

}find(

1,n);

cout

return0;

}

奶牛排序 RMQ

問題描述 奶牛在熊大媽的帶領下排成了一條直隊。顯然,不同的奶牛身高不一定相同 現在,奶牛們想知道,如果找出一些連續的奶牛,要求最左邊的奶牛 a 是最矮的,最右 邊的 b 是最高的,且 b 高於 a 奶牛,且中間如果存在奶牛,則身高不能和 a b 奶牛相同,問這樣的一些奶牛最多會有多少頭。從左到右給出...

USACO 奶牛排隊

題目 給出乙個只含有1,2,3的數字序列,問最少交換多少次才能將之變為遞增數列。解 注意到只有1,2,3,我們只要將1,3交換到自己的應在位置上那麼排序就已經完成了。需要交換的有幾種,記 a x,y 表示x在應該是y的位置上的 a i 的個數,那麼我們優先交換a 1,3 和a 3,1 裡的數字,一次...

COGS1212 奶牛排隊

奶牛在熊大媽的帶領下排成了一條直隊。顯然,不同的奶牛身高不一定相同 現在,奶牛們想知道,如果找出一些連續的奶牛,要求最左邊的奶牛a是最矮的,最右邊的b是最高的,且b高於a奶牛,中間如果存在奶牛,則身高不能和a b奶牛相同。問這樣的奶牛最多會有多少頭?從左到右給出奶牛的身高,請告訴它們符合條件的最多的...