51nod 1153 選擇子串行

2022-05-19 22:12:19 字數 1125 閱讀 9213

51nod 選擇子串行

這道題是\(bunny\)

學長在給我們的模擬賽中的一道題。

食用單調棧,處理每個數\(a_i\)左右第乙個比自己大的數的下標\(left_i\),\(right_i\),並且建兩條有向邊\((i,left_i)\),\((i,right_i)\)。處理完畢後得到乙個\(dag\)。

然後求此圖的拓撲序。由於都是小數連大數,所以可以以\(a_i\)的值為關鍵字排序,\(sort\)後即得到此\(dag\)的乙個拓撲序。

求得拓撲序後,即可\(o(n)\)

\(dp\) 求\(dag\)最長鏈。最長鏈即為\(ans\)。

#include #include #include #include #include #include #define maxn 100233

using namespace std;

struct qmq

a[maxn];

int n;

struct qwq

;stackx,y;

int l[maxn],r[maxn];

struct qvq

e[maxn<<1];

int tot=0,h[maxn]={};

int f[maxn];

inline void add(int u,int v)

bool cmp(qmq o,qmq t)

int main()

for (int i=1;i<=n;i++)

r[x.top().id]=i;

x.pop();

} x.push((qwq)); }

for (int i=n;i;i--)

l[y.top().id]=i;

y.pop();

} y.push((qwq));

} for (int i=1;i<=n;i++)

sort(a+1,a+n+1,cmp);

for (int i=1;i<=n;i++) }

int ans=-233333;

for (int i=1;i<=n;i++)

printf("%d",ans);

return 0;

}

51nod 1153 選擇子串行

長度為n的整數陣列a,所有的數均不相同,假設下標從0開始。找到乙個最長的陣列b,b陣列的長度為k,數值範圍是0 n 1,記錄的是a陣列的下標。滿足a b 0 a b 1 a b 2 a b k 並且對任意連續的兩項b i 及b i 1 滿足min b i b i 1 j max b i b i 1 ...

選擇子串行 51Nod 1153

長度為n的整數陣列a,所有的數均不相同,假設下標從0開始。找到乙個最長的陣列b,b陣列的長度為k,數值範圍是0 n 1,記錄的是a陣列的下標。滿足ab 0 ab 1 ab 2 ab k 並且對任意連續的兩項b i 及bi 1 滿足min b i bi 1 j max b i bi 1 均有aj ab...

51nod 1153 選擇子串行 (好題)

這個題很不錯。採用貪心的思想 首先考慮到在整個序列中取最大值一定是最優的,也就是說b陣列的第乙個數是a陣列的中最大值的下標。而且通過題意我們發現,一旦選定了某個數就把當前的區間劃分成兩份。比如說第一次選了9,第二次選了10,那麼下一次肯定不會選8 這幾個數字說的都是下標 不會垮區間選數,那麼我們就可...