單調棧還是挺厲害的,將n方的複雜度降為n,66666
看了別人的部落格和**慢慢理解了其中的奧妙。。自己寫的第乙個單調棧,
1 #include 2using
namespace
std;
3int a[50], le[50], lo[50];4
intmain()
10 a[0] = -3, a[n+1] = -1;11
for(int i = 1; i <= n+1; ++i)else
if(a[i] ==a[lo[num]])
18while(a[i] 23 le[i] =le[lo[num]];
24 --num;25}
26 lo[++num] =i;27}
28 printf("
%d : %d - > %d\n
", m, l, r);
29return0;
30 }
公升級版
1 #include 2using
namespace
std;
3int a[50], s[50];4
intmain()
10 a[0] = -3, a[n+1] = -1;11
for(int i = 1; i <= n+1; ++i)
17 --num;18}
19 s[++num] =i;20}
21 printf("
%d : %d - > %d\n
", m, l, r);
22return0;
23 }
思維真是好東西。。。。。。
輸入:
6輸出3 1 6 4 5 2
603 5
1 #include 2#define ll long long
3const
int maxn = 1e5+2
;4 ll sum[maxn], cnt, m = -1;5
inta[maxn], s[maxn], n, num, l, r;
6int
main()
17 --num;18}
19 s[++num] =i;20}
21 printf("
%lld\n%d %d\n
", m, l, r);
22return0;
23 }
找矩陣中1最多的子矩陣
1 #include 2 #include 3using
namespace
std;
4const
int maxn = 2005;5
intb[maxn][maxn], s[maxn];
6int
main()16}
17for(int i = 1; i <= n; ++i)
26 s[++num] =j;27}
28}29 printf("
%d\n
", mx);30}
31return0;
32 }
計算能看到牛的個數和(每只牛都往右看且只能看到小於自己的牛)
自己寫的
1 #include 2 #include 3using
namespace
std;
4#define ll long long
5const ll inf = 1e9+10;6
const
int maxn = 80009;7
inta[maxn], s[maxn], n;
8 unsigned long
long m = 0;9
intmain()
15 a[0] = inf+1, a[n+1] =inf;
16for(int i = 1; i <= n+1; i++)
21 s[++num] =i;22}
23 printf("
%u\n
", m);
24return0;
25 }
參考別人的**。6666666只需要乙個棧陣列就好,,每次棧裡面的元素就是可以看到當前牛的個數,因為棧裡面的元素是嚴格降序排列的。。
1 #include 2 #include 3int s[80003];4
intmain()
14 printf("
%lld\n
", sum);
15return0;
16 }
括號匹配求字長的匹配區間
1 #include 2 #include 3 #include4using
namespace
std;
5char str[100009];6
int s[100009];7
intmain()else24}
25 printf("
%d\n
", sum);26}
27return0;
28 }
只有不斷學習才能進步!
單調佇列與單調棧
單調棧 單調棧,顧名思義,就是維持單調性 遞增或者遞減 的棧結構,如果新入棧的元素破壞了單調性,就彈出原先棧內元素,直到能夠滿足單調性 用途 它可以很方便地求出某個數的左邊或者右邊第乙個比它大或者小的元素,而且總時間複雜度o n 並且單調棧本身並不難實現 維護 每次入棧前先檢驗入棧後是否會破壞棧的單...
單調佇列與單調棧
線段樹等等容易tle,我們需要乙個o n 的演算法來解決這個問題。思路 可以看出,這個視窗是可以用乙個雙向佇列來模擬的,每當後方加入乙個數,都要從佇列尾部開始淘汰掉所有的小於它的數,保證佇列中每乙個數的後面,在視窗範圍內沒有大於等於它的數。當隊首元素不在視窗範圍時,隊首元素出隊。這樣操作後,隊內的元...
單調佇列與單調棧
線段樹等等容易tle,我們需要乙個o n 的演算法來解決這個問題。思路 可以看出,這個視窗是可以用乙個雙向佇列來模擬的,每當後方加入乙個數,都要從佇列尾部開始淘汰掉所有的小於它的數,保證佇列中每乙個數的後面,在視窗範圍內沒有大於等於它的數。當隊首元素不在視窗範圍時,隊首元素出隊。這樣操作後,隊內的元...