有一个很迷惑的关于数据范围的问题
查看原帖
有一个很迷惑的关于数据范围的问题
159110
岱山独尊楼主2021/8/29 22:22

我调了半天的程序都是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;
}
2021/8/29 22:22
加载中...