只需要记录每一个数的正负号即可,求每一个前缀的正号的个数。
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long int LL;
const int N=1e5*2+10;
LL f[N],s[N];// f该位是正,负 s正的个数的前缀和
int main(void)
{
LL n; cin>>n;
f[0]=1;
for(int i=1;i<=n;i++)
{
int x; cin>>x;
if(x<0) f[i]=-f[i-1];
else f[i]=f[i-1];
}
s[0]=1;//初始化 我觉得就是处理自身的情况
for(int i=1;i<=n;i++)
{
if(f[i]>0) s[i]=s[i-1]+1;
else s[i]=s[i-1];
}
LL temp=0;
LL ans=n*(n-1)/2+n;
for(int i=1;i<=n;i++)
{
if(f[i]>0) temp+=s[i-1];
else temp+=i-s[i-1];
}
cout<<ans-temp<<" "<<temp<<endl;
return 0;
}
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long int LL;
int main(void)
{
int n; cin>>n;
LL ans1=0,ans2=0;
LL s=1,l=0,r=1;// l,r 保存的就是前缀和中有多少个负号 正号
while (n -- )
{
int x; cin>>x;
if(x<0) s=-s;
if(s>0) ans2+=r,ans1+=l,r++;
else ans2+=l,ans1+=r,l++;
}
cout<<ans1<<" "<<ans2<<endl;
return 0;
}