給定乙個最大容量為 m 的堆疊,將 n 個數字按 1, 2, 3, ..., n 的順序入棧,允許按任何順序出棧,則哪些數字序列是不可能得到的?例如給定 m=5、n=7,則我們有可能得到,但不可能得到。
輸入第一行給出 3 個不超過 1000 的正整數:m(堆疊最大容量)、n(入棧元素個數)、k(待檢查的出棧序列個數)。最後 k 行,每行給出 n 個數字的出棧序列。所有同行數字以空格間隔。
對每一行出棧序列,如果其的確是有可能得到的合法序列,就在一行中輸出yes
,否則輸出no
。
網上大多數部落格是通過棧模擬過程,但我的方法比較玄學。
1.首先如果要保證堆疊最大容量m,只需要保證當前的值-之前出棧的數量<=m。
2.如果要保證不會出現類似樣例二中7,5,6這種比5大的7出棧了而比5大的6卻沒有出棧的情況,只需要保證對任意\(a[i] > a[i+1]\),所有的\(x(a[i+1] < x < a[i])\)都已經出棧。
對於1我們掃一遍陣列,邊掃邊判斷即可。
對於2我們利用權值bit維護區間值的數量以\(o(log(n))\)的複雜度check即可。
總複雜度\(o(knlog(n))\),可以接受。
#include using namespace std;
#define int long long
inline int rd()
int n, m, k, a[1010], t[1010];
void add(int p)
int ask(int p)
int range_ask(int l,int r)
void run()
puts(ans ? "yes" : "no");
}}signed main()
7 8 出棧序列的合法性(25 分)
給定乙個最大容量為 m 的堆疊,將 n 個數字按 1,2,3,n 的順序入棧,允許按任何順序出棧,則哪些數字序列是不可能得到的?例如給定 m 5 n 7,則我們有可能得到,但不可能得到。輸入第一行給出 3 個不超過 1000 的正整數 m 堆疊最大容量 n 入棧元素個數 k 待檢查的出棧序列個數 最...
出棧序列的合法性
給定乙個最大容量為 m 的堆疊,將 n 個數字按 1,2,3,n 的順序入棧,允許按任何順序出棧,則哪些數字序列是不可能得到的?例如給定 m 5 n 7,則我們有可能得到,但不可能得到。輸入格式 輸入第一行給出 3 個不超過 1000 的正整數 m 堆疊最大容量 n 入棧元素個數 k 待檢查的出棧序...
pta7 5 出棧序列的合法性 25 分
給定乙個最大容量為 m 的堆疊,將 n 個數字按 1,2,3,n 的順序入棧,允許按任何順序出棧,則哪些數字序列是不可能得到的?例如給定 m 5 n 7,則我們有可能得到,但不可能得到。輸入第一行給出 3 個不超過 1000 的正整數 m 堆疊最大容量 n 入棧元素個數 k 待檢查的出棧序列個數 最...