分析
二重循环会TLE,所以就要思考如何优化。(研究了很久)
当
时,(
不可能,
会重复)且颜色不同
那么
一重循环时j的增加数量取决于i的个数,而i前缀和就好了。
用两个数组a和b,a[j]表示Ci为j时的下标和,b[j]表示Ci为j时的个数。然后水水地到了第一。
代码
#include <cstdio>
#include <cctype>
using namespace std;
long long ans,a[2],b[2],n;
int in(){
int ans=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans;
}
int main(){
n=in();
for (int i=1;i<=n;i++){
bool x=in(); a[x]+=i; b[x]++;
ans+=i*b[1-x]-a[1-x];
}
return !printf("%lld",ans);
}