考虑 ,于是维护
即可,又发现等价于维护
,对于后面这个式子,只有
或者
时才会有贡献,对于前面维护后缀和,对于后面维护后缀奇数个数和,简单合并答案即可。代码:
#include<bits/stdc++.h>
#define ll long long
#define db double
#define vec vector
#define pb push_back
#define pll pair<ll,ll>
#define mkp make_pair
#define il inline
#define endl "\n"
using namespace std;
const ll mod=998244353;
const ll inf=1e18;
ll n,a[200005],s[200005],suf[200005];
void solve(){
cin>>n;ll ans=0;
for(ll i=1;i<=n;i++) cin>>a[i],s[i]=s[i-1]+a[i];
suf[n+1]=0;
for(ll i=n;i;i--) suf[i]=suf[i+1]+(a[i]%2);
for(ll i=1;i<n;i++) ans+=(n-i)*a[i]+s[n]-s[i];
ans>>=1;ll res=0;
for(ll i=1;i<n;i++){
if(a[i]&1) res+=(n-i)-suf[i+1];
else res+=suf[i+1];
}
res>>=1;
cout<<(ans-res)<<endl;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
ll T;cin>>T;
while(T--) solve();
return 0;
}

京公网安备 11010502036488号