HDU 3410(遞減單調棧)

2021-09-21 21:38:59 字數 1266 閱讀 7466

現在有n個人站成一行,告訴你每個人的身高。

現在每個人都要找到在他左邊,比他矮的人中最高的人的位置。

同時也要找到,在他右邊比他矮的人中最高的人的位置。

注意由於他們是站成一行的,所以他們不能越過比他們高的人去看後面的人。

也就是說,他只能看到他本人和他的左邊(或右邊)第乙個比他高的人之間的那些人。

請輸出每個人左邊比他矮的人中最高的人的位置,以及每個人的右邊比他矮的人

中最高的人的位置(沒有的話輸出0,位置從1開始)。

sample input:

2

55 2 4 3 1

52 1 4 3 5

sample output:

case 1:

0 30 0

2 40 5

0 0case 2:

0 20 0

1 40 0

3 0

對於每個數(記為a)輸出兩個數,要輸出的第乙個數,表示從這個數往左走,直到第乙個數或者比他大的數,記為b,輸出(b,a)中的最大數的索引(從1開始)。要輸出的第二個數,表示從這個數往右走,直到最後乙個數,或者比他小的數,記為b,輸出(a,b)中的最小數的索引(從1開始)。

典型單調棧,維護兩個遞減棧,(乙個也可以,不好想,也還行,,,)。

#include#define io ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

#define ll long long

#define inf 0x3f3f3f3f

using namespace std;

const int n=1e5+100;

int s[n],a[n],index[n];

par ans[n];

int main()

else

}printf("case %d:\n",++cas);

for(int i=1;i<=n;++i)printf("%d %d\n",ans[i].first,ans[i].second);

}return 0;

}

the end;

單調遞減佇列

題意 給定乙個長度為n的序列,有乙個長度為k的滑動視窗,視窗從左向右依次移動,求每次移動時視窗中的最大值。演算法實現 1.有一種很常見的演算法,時間複雜度為o n k 的演算法,線性遍歷每個數再求每個滑動視窗中的最大值,但當k很大的時候非常耗時。2.還有一中就是單調遞減佇列,可以把時間複雜度優化到接...

求最長單調遞減子串行

來自 問題描述 求乙個陣列的最長遞減子串行 比如的最長遞減子串行為。思路 這是很經典的乙個問題,用動態規劃解決。假設源陣列為a,定義乙個輔助陣列為b,b i 表示以a i 結尾的最長遞減序列的長度。舉個簡單的例子,如果a i 大於之前的所有元素,那麼b i 1。有了這個輔助陣列 後,可以推出下面這個...

dp求最長單調遞減序列

一道線性dp,和前天寫的是一樣的,今天準備在學一學二分寫法 ac include h using namespace std 最大單調遞減序列 define maxn 1005 int dp maxn int a maxn int n void slove dp int maxx 1 for int...