二分 單調棧 SPOJ MINSUB

2021-07-26 06:31:53 字數 1096 閱讀 1604

題目:

一開始並不會做,然後看了看下面的題解:

然後大體思想理解了,之前寫單調棧一直都是用stack,node裡記錄向前延伸向後延伸以及當前的數值和位置,寫這個題的時候覺得用這種方法寫起來比較麻煩,然後嘗試去使用題解中的方法,單調棧可以像這篇題解中使用乙個陣列來模擬棧,同時分兩次遍歷陣列並統計每個元素的向前延伸和向後延伸,也是一種比較簡單的寫法。此類題目基本都可以用二分來解決,最後注意二分的取值。

附上**:

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include #include //#include //#include #define ll long long

#define ull unsigned long long

//#define int64 long long

#define inf 0x3f3f3f3f

using namespace std;

const int maxn = 1e3 + 5;

int t, n, m, k;

int a[maxn][maxn], b[maxn][maxn], l[maxn][maxn], r[maxn][maxn], st[maxn], top;

int check(int x)

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

top = 1;

st[1] = r[i][m] = m;

for (int j = m - 1; j >= 1; j--)

for (int j = 1; j <= m; j++)

}return ans;

}int main()

cout << mmax << " " << check(mmax) << endl;

}//fclose(stdin);

//fclose(stdout);

return 0;

}

二分(二分答案 二分搜尋)與單調性

經典二分搜尋是二分空間範圍。二分答案又叫二分猜值,是二分解的值空間。其實可以統一,普通的二分搜尋也是二分答案值域 下標空間,也是猜值。二分必須滿足單調性,最直觀的,二分搜尋只能在有序陣列上進行。單調性體現在,下標和元素值是單調的,也就是 if j i 有 a j a i 一般二分答案解決的問題是最優...

尋找段落(二分 單調佇列)

題目描述 給定乙個長度為n的序列a i,定義a i 為第i個元素的價值。現在需要找出序列中最有價值的 段落 段落的定義是長度在 s,t 之間的連續序列。最有價值段落是指平均值最大的段落,段落的平均值 段落總價值 段落長度。輸入輸出格式 輸入格式 第一行乙個整數n,表示序列長度。第二行兩個整數s和t,...

中間數(二分) 單調佇列

1 中間數 mid.cpp c pas 問題描述 有n個整數 a1 an 任意兩個整數做絕對值差 ai aj 1 i 可以得到 n n 1 2 個絕對值差,令 m n n 1 2 保證m 一定是個偶數,求第 m 2小的數 輸入格式 輸入檔名為mid.in。第一行,乙個整數n 接下來n行,每行乙個整數...