队列——切蛋糕

发布时间:2026/7/22 4:44:45
队列——切蛋糕 这道题是前缀和与单调队列的结合先看题目题目要求小Z能得到的最大幸运值就相当于求在一段长度小于m的任意长度区间内能得到的最大幸运值如果全为正可直接用前缀和解决只需要求出值最大的段区间的和就行但这道题我们需要考虑负数的情况就要再加上单调递增队列核心代码l1,r0; p[r]0; for(int i1;in;i){ while(lrp[l]i-m) l; mxmax(mx,a[i]-a[p[l]]); while(lra[p[r]]a[i]) r--; p[r]i; }因为段区间在[l,r]间所以r-l-1m;可推出lr-m完整代码#includebits/stdc.h using namespace std; #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0) #define ll long long #define endl \n #define fi firse #define se second const ll N1e610; ll l,r; ll p[N]; ll a[N]; void solve() { ll n,m; cinnm; for(int i1;in;i){ cina[i]; } a[0]0; ll mx-1e18; for(int i1;in;i){ a[i]a[i-1]a[i]; } l1;r0; p[r]0; for(int i1;in;i){ while(lrp[l]i-m) l; mxmax(mx,a[i]-a[p[l]]); while(lra[p[r]]a[i]) r--; p[r]i; } coutmx; } signed main() { IOS; ll T1; while(T--) solve(); return 0; }