vijos1548 奶牛排隊 題解

2021-08-06 03:22:00 字數 1928 閱讀 2290

保證絕對非暴力做法!!

原題位址見下面。

————————————————————

」今天陽光明媚呢?「勇者躺在草坪上。

持續數週的風暴過去之後,他終於得以出門。

」這個時候……不來道應用試試?「

路由器拿出了檸檬,咬了一口,指了指那邊的農場。

————————————————————

【問題描述】

奶牛在熊大媽的帶領下排成了一條直隊。

顯然,不同的奶牛身高不一定相同……

現在,奶牛們想知道,如果找出一些連續的奶牛,要求最左邊的奶牛a 是最矮的,最右

邊的b 是最高的,且b 高於a 奶牛,且中間如果存在奶牛,則身高不能和a、b 奶牛相同,

問這樣的一些奶牛最多會有多少頭。

從左到右給出奶牛的身高,請告訴它們符合條件的最多的奶牛數(答案可能是零、二,

但不會是一)。

【輸入格式】

第一行乙個數n(2<=n<=100000),表示奶牛的頭數。

接下來n 個數, 每行乙個數, 從上到下表示從左到右奶牛的身高( 1<= 身高

<=maxlongint)。

【輸出格式】

一行,表示最多奶牛數。

【輸入樣例】tahort.in

5 1

2 3

4 1

【輸出樣例】tahort.out

4 【樣例解析】

取第1 頭到第4 頭奶牛,滿足條件且為最多。

(題外話)暴力不要信!!rmq是正解!!dp什麼的都是暴力!!資料太水啦!!!!!!!!

————

這是路由器唯一要狠狠點艹的題,問候出題人。

資料水不說,題目描述的真的是含糊不清(至少對路由器而言是這樣的)

首先題目簡化為查最大合法序列,其中這個序列要求首《中間所有《尾。

那麼,乙個合格的序列,除了開頭和結尾外不能包含原序列中的最大值(max)和最小值(min)(二者序號都是向內取值)。

所以,我們對於這樣的乙個序列。

……min……max……

我們就得到了從min-max的合法序列,記錄下來。

完後就是找min左側和max右側了。

很不幸,還有一種情況。

……max……min……

此時我們就要對三個區間進行討論。

rmq用來處理求max與min的,很明顯st表上去。(或者兩棵線段樹?滑稽)

時間複雜度o(nlogn)st表建立+o(nlogn?)分治+o(1)查詢,還穩定,不用擔心wa(最多re(笑),re原因見下)。

至少網上的題解都是o(n*n)的,拿這個程式去虐他們吧!

接下來說一下點艹的地方。

大資料請不要用檸檬評測或者自己主機執行,由於遞迴次數過多會導致爆棧。

推薦上剛剛的**上評測。

//虧我調了兩天最後發現re不是我的問題換個方式評測就好了。

//小貼士:st表不要存值,存這個值的位置,能夠優化不少查詢時間。

#include

#include

using

namespace

std;

long

long a[100001];

int minn[100001][21];

int maxn[100001][21];

int qpow(int a)

int fmin(int c,int d)

void st(int n)

}return;

}int ans=0;

void fen(int l,int r)else

}int main()

st(n);

fen(1,n);

printf("%d",ans);

return

0;}

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奶牛相同。問這樣的奶牛最多會有多少頭?從左到右給出奶牛的身高,請告訴它們符合條件的最多的...

高手訓練 RMQ 奶牛排隊

第一題由於過水,就沒寫awa 大概就是這樣了。題意就是求乙個最長的區間使得區間的左邊是它的最小值,區間右邊是他的最大值 第乙個想法肯定是暴力列舉啦awa 但是這個是o n 3 的,絕對的不可過awa 思考性質awa 發現我們列舉每個區間的左右端點,其實有大量的不合法的計算的 也就是沒有用的列舉。考慮...