P9880 题解
从序列中选出一对二元组
首先考虑暴力解法,时间复杂度
众所周知,一个非正数乘一个正数一定小于两者之和,所以直接统计一下序列中负数和正数的个数,答案即为两者乘积。
代码:
cin>>n;
for(int i=1;i<=n;i++)cin>>x,x>0?z++:f++;
cout<<z*f<<"\n";
然后发现样例都没过
为何错了呢?
我们发现
cout<<z*f+v1*(z-v1)<<"\n";
然后发现又WA了
别忘了,如果序列中有多个
别忘了开 long long。
全部代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int t,n,x,z,f,v1;
signed main(){
for(cin>>t;t;z=f=v1=0,t--){
cin>>n;
for(int i=1;i<=n;i++)cin>>x,x>0?z++:f++,v1+=x==1;
cout<<z*f+v1*(z-v1)+v1*(v1-1)/2<<"\n";
}
return 0;
}