出棧序列的合法性 25分 之樹狀陣列玄學做法

2022-09-10 23:45:23 字數 905 閱讀 2667

給定乙個最大容量為 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 待檢查的出棧序列個數 最...