現在有n個人站成一行,告訴你每個人的身高。現在每個人都要找到在他左邊,比他矮的人中最高的人的位置。
同時也要找到,在他右邊比他矮的人中最高的人的位置。
注意由於他們是站成一行的,所以他們不能越過比他們高的人去看後面的人。
也就是說,他只能看到他本人和他的左邊(或右邊)第乙個比他高的人之間的那些人。
請輸出每個人左邊比他矮的人中最高的人的位置,以及每個人的右邊比他矮的人
中最高的人的位置(沒有的話輸出0,位置從1開始)。
sample input:sample output:2
55 2 4 3 1
52 1 4 3 5
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...