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 這幾個數字說的都是下標 不會垮區間選數,那麼我們就可...