題目傳送門
#include using namespace std;
//brute-force 暴力
const int n = 300010;
const int inf = 0x3f3f3f3f;
int s[n];
int res = -inf;
int n, m;
//tle掉3個點
//通過了 11/14個資料
int main()
因為當列舉每個結點i
時,可以視為i
是固定的,而j
是在區間i - m + 1 <= j <= i
內滑動,所以s[i]
是乙個固定值,變化的其實是j
,即要求s[j - 1]
的最小值。滑動視窗的區間是[i - m,i - 1]
,單調佇列維護的是該區間的最小值,由於滑動視窗不包含i
,因此res
需要在while
上方進行更新。
#include using namespace std;
const int n = 300010;
const int inf = 0x3f3f3f3f;
int n; //n個數字
int m; //連續長度為m
int q[n]; //單調佇列,記錄的是序號
int s[n]; //字首和
int main()
//輸出結果
printf("%d", res);//是字首和,就要小心會不會爆int,但此題n,m上限只有300000,即使是n*m也不會爆int,不用開long long
return 0;
}
AcWing 135 最大子序和
acwing 135.最大子序和 大佬講解 原題解鏈結見文末 單調佇列 o n 首先單調佇列,不同一般的佇列,他需要的stl是deque 雙端佇列,因為我們要支援隊頭插入和隊尾插入.單調佇列做法大致如下 首先我們需要找到單調性,這道題目的顯而易見.我們知道區間和的做法,一般都是字首和,而字首和的求法...
Acwing135 最大子序和
輸入乙個長度為n的整數序列,從中找出一段長度不超過m的連續子串行,使得子串行中所有數的和最大。注意 子串行的長度至少是1。輸入格式 第一行輸入兩個整數n,m。第二行輸入n個數,代表長度為n的整數序列。同一行數之間用空格隔開。輸出格式 輸出乙個整數,代表該序列的最大子序和。資料範圍 1 n,m 300...
AcWing 135 最大子序和
輸入乙個長度為n的整數序列,從中找出一段長度不超過m的連續子串行,使得子串行中所有數的和最大。注意 子串行的長度至少是1。輸入格式 第一行輸入兩個整數n,m。第二行輸入n個數,代表長度為n的整數序列。同一行數之間用空格隔開。輸出格式 輸出乙個整數,代表該序列的最大子序和。資料範圍 1 n,m 300...