标签:一个 algorithm play long scan 分享 open 重复 ==
中文题
n^4 就不说了
显然n^2可以
那么我们可以求出每两个能得出的和的个数 然后每个数出现的次数
考虑a[i] a[j] 相同
那么 可以加上 sum[a[i]+a[j]] 那么多算了什么呢 多算了 给另外一个人cnt[a[i]] -1 同理 cnt[a[j]]-1 然后有一个重复了 +1
不同的时候也差不多
#include<cstdio> #include<cstring> #include<map> #include<iostream> #include<algorithm> #include<math.h> #include<map> #include<queue> #include<vector> using namespace std; #define ll long long #define MAXN 2000010 int sum[MAXN]; int cnt[MAXN]; int z[1010]; int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&z[i]); cnt[z[i]]++; } for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) sum[z[i]+z[j]]++; } ll ans=0; for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) { ans=ans+sum[z[i]+z[j]]; if(z[i]==z[j]) { ans=ans-(cnt[z[i]]-1)-(cnt[z[j]]-1)+1; } else { ans=ans-cnt[z[i]]-cnt[z[j]]+1; } } } cout<<ans<<endl; return 0; }
你要相信自己的
标签:一个 algorithm play long scan 分享 open 重复 ==
原文地址:http://www.cnblogs.com/cherryMJY/p/7732544.html