題目:
一開始並不會做,然後看了看下面的題解:
然後大體思想理解了,之前寫單調棧一直都是用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行,每行乙個整數...