题意:给 n(2*10^5)个数,取出三个数Ni,Nj,Nq,(1<=i<j<q<=n);要求他们成等比,并且比例系数为k,统计总的个数
分析:枚举中值,用map暴力,之前用map用的少,现在写一发。
</pre><pre name="code" class="cpp">#include <iostream>
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <string.h>
#include <map>
#include <set>
using namespace std;
#define maxn 2000005
#define inff 1000000000
typedef long long LL;
LL a[maxn],n,k;
map<LL,LL>mp1,mp2;
int main()
{
int i;
while(scanf("%lld%lld",&n,&k)!=EOF)
{
mp1.clear();
mp2.clear();
for(i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
mp2[a[i]]++;//统计中值后面的数出现的次数.
}
LL ans=0;
for(i=1;i<n;i++)//枚举中值
{
if(i==1)
{
mp2[a[i]]--;
mp1[a[i]]++;
}
else
{
mp2[a[i]]--;//先把中值这 个数的个数减去
if(a[i]%k==0)
ans+=(LL)mp1[a[i]/k]*(LL)mp2[a[i]*k];
mp1[a[i]]++;//用另一个map存中值前的数出现的次数
}
}
cout<<ans<<endl;
}
return 0;
}