洛谷P1714切蛋糕
思路:
题意即给一个长度为
N
N
N的数组
a
1
,
a
2
,
⋯
,
a
N
a_1,a_2,\cdots,a_N
a1,a2,⋯,aN,求
max
{
∑
i
=
l
r
a
i
∣
r
−
l
+
1
≤
M
}
\max\{\sum_{i=l}^{r}a_i|r-l+1\le M\}
max{∑i=lrai∣r−l+1≤M}。
可以转换成
s
u
m
r
=
∑
i
=
1
r
a
i
sum_r=\sum_{i=1}^{r}a_i
sumr=∑i=1rai,求
max
{
s
u
m
i
−
s
u
m
j
∣
i
−
j
+
1
≤
M
}
\max\{sum_i-sum_j|i-j+1\le M\}
max{sumi−sumj∣i−j+1≤M}。这样复杂度为
O
(
N
M
)
O(NM)
O(NM),按照数据规模会
T
L
E
TLE
TLE。接着转换即固定
s
u
m
i
sum_i
sumi,然后求
s
u
m
i
−
min
{
s
u
m
j
∣
i
−
j
+
1
≤
M
}
sum_i-\min\{sum_j|i-j+1\le M\}
sumi−min{sumj∣i−j+1≤M}。然后用单调队列维护
s
u
m
j
sum_j
sumj即可。
代码:
#include<bits/stdc++.h>
#define pii pair<int,int>
#define ll long long
#define cl(x,y) memset(x,y,sizeof(x))
#define ct cerr<<"Time elapsed:"<<1.0*clock()/CLOCKS_PER_SEC<<"s.\n";
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define lson x<<1,l,mid
#define rson x<<1|1,mid+1,r
#define INF 1e18
const int N=1e6+10;
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
const double eps=1e-8;
const double pi=acos(-1);
using namespace std;
int sum[N];
struct edge
{
int v,id;
};
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int n,m,i;
cin>>n>>m;
sum[0]=0;
for(i=1;i<=n;i++)
{
int x;
cin>>x;
sum[i]=sum[i-1]+x;
}
deque<edge> q;
int ans=-inf;
for(i=1;i<=n;i++)
{
while(!q.empty() && sum[i]<=q.back().v)
q.pop_back();
while(!q.empty() && i-m>q.front().id)
q.pop_front();
q.push_back({sum[i],i});
if(i<m)
ans=max(ans,sum[i]);
ans=max(ans,sum[i]-q.front().v);
}
cout<<ans<<endl;
return 0;
}