保證絕對非暴力做法!!
原題位址見下面。
————————————————————
」今天陽光明媚呢?「勇者躺在草坪上。
持續數週的風暴過去之後,他終於得以出門。
」這個時候……不來道應用試試?「
路由器拿出了檸檬,咬了一口,指了指那邊的農場。
————————————————————
【問題描述】
奶牛在熊大媽的帶領下排成了一條直隊。
顯然,不同的奶牛身高不一定相同……
現在,奶牛們想知道,如果找出一些連續的奶牛,要求最左邊的奶牛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 發現我們列舉每個區間的左右端點,其實有大量的不合法的計算的 也就是沒有用的列舉。考慮...