【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

浙公网安备 33010602011771号