【Tai_mount】算法学习 - 注意事项 - 关于数据范围到多大要开longlong

虽然说int能到2e9差不多,但是到1e9也请开ll。

如下例子:
(luoguP5858)

#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;
}

其中a[]的范围是1e9,但是由于存在一个表达式:“a[i]*j”。就爆了。

需要注意的是:加法/乘法是左结合的,所以a[i]*j的返回值的类型是根据a[]的类型而定。

如果我们改成"ja[]而同时仅把j设置为ll,a[]依旧为int,结果是不会爆。

总的来说遇到1e9就直接ll就好,不用管其他。

快速方法:
#define int long long然后主函数改成signed main

posted @ 2021-08-29 22:37  Tai_mount  阅读(240)  评论(0)    收藏  举报