题解:CF1984C2 Magnitude (Hard Version)
Lucas_Fan_2013 · · 题解
思路
观察易得,只有在
也就是说,只有到了第
题目要求最大值的不同操作个数。
最大值:我们找到最小的
我们维护所有最小的
对于每个
-
对于
a_j (1 \le j < i ),只有b_j \ge 0 时使用操作2 不改变最大值。(显然) -
对于
a_j (i < j \le n ),不管b_j 取何值,都不影响。
::::info[为什么对于
因为我们执行了一次操作
所以,若与
因为
证毕。
::::
上述所有满足条件的
我们记
于是单个
最后把所有前缀和最小的
若对于所有
AC Code
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+10,mod=998244353;
int t;
int n;
int a[N],b[N]; // b表示前缀和
int ksm(int a,int b){ // 快速幂
int res=1;
while (b>0){
if (b&1==1) res=res%mod*a%mod;
a=a%mod*a%mod,b>>=1;
}
return res;
}
int ans;
signed main(){
cin>>t;
while (t--){
cin>>n,ans=0,b[0]=0;
int cnt=0,zx=0;
for (int i=1;i<=n;i++) cin>>a[i],b[i]=a[i];
for (int i=1;i<=n;i++) b[i]+=b[i-1],zx=min(zx,b[i]);
if (zx>=0){
cout<<ksm(2,n)<<endl;
continue;
}
for (int i=1;i<=n;i++){
if (zx==b[i]){
ans=(ans+ksm(2,cnt)%mod*ksm(2,n-i)%mod)%mod;
}
if (b[i]>=0) cnt++;
}
cout<<ans<<endl;
}
return 0;
}