我调了半天的程序都是50分,但最后只是把输入的坚固度那个数组a改成long long就过了……
但是我看数据范围是1e9小于int的2e9啊。
求大佬帮助蒟蒻Orz
下面是我的代码,第6行的long long如果是int就是50分,现在的代码是ac的
#include<iostream>
#include<cstring>
using namespace std;
const int N=5007;
const long long MAXN=1008600110086001ll;
int n,s,w;
long long a[N];
int monoQ[N];
long long dp[N][N];
void input(){
cin>>n>>w>>s;
for(int i=1;i<=n;i++){
cin>>a[i];
}
}
void fun(){
for(int i=0;i<=n;i++) for(int j=0;j<=w;j++) dp[i][j]=-MAXN;
dp[0][0]=0;
for(int i=1;i<=n;i++){
int l=1,r=1;
monoQ[l]=w;
for(int j=w;j;j--){
while(l<=r&&monoQ[l]>j-1+s){
l++;
}
while(l<=r&&dp[i-1][monoQ[r]]<dp[i-1][j-1]){
r--;
}
monoQ[++r]=j-1;
dp[i][j]=dp[i-1][monoQ[l]]+a[i]*j;
}
}
}
void output(){
long long ans=-MAXN;
for(int j=1;j<=w;j++){
ans=max(ans,dp[n][j]);
}
cout<<ans;
}
int main(){
input();
fun();
output();
return 0;
}