
分析
二重循环会TLE,所以就要思考如何优化。(研究了很久)
当i<ji<ji<j时,(i=ji=ji=j不可能,i>ji>ji>j会重复)且颜色不同
那么ans+=j−ians+=j-ians+=j−i
一重循环时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);
}
本文介绍了一种通过优化一重循环解决二重循环TLE问题的方法。针对i小于j且颜色不同的情况,利用两个数组记录颜色j出现的位置和数量,避免了不必要的重复计算,实现了高效求解。
283

被折叠的 条评论
为什么被折叠?



