CF 567C Geometric Progression

题目大意:输入两个整数 n 和 k ,接下来输入n个整数组成的序列。求该序列中三个数 满足条件的子串个数(要求字串由三个整数a,b,c组成,其中 c = k * b = k * k * a)。

思路:枚举中间的数,然后分别求出前面和后面满足条件的数的个数,将两数相乘,然后累加积即可。

  由于题目中给出的数据范围较大,且有负数,故用MAP来影射输入的序列中的每个元素。

代码:

  #include<iostream>
  #include<cstdio>
  #include<cstring>
  #include<cstdlib>
  #include<cmath>
  #include<queue>
  #include<map>
  #include<algorithm>
  using namespace std;
  #define INF 0x7fffffff

  map<long long,long long> m;
  long long n,k,a[200001],pre[200001],late[200001];
  long long sum;
  int main(){
   while(~scanf("%I64d%I64d",&n,&k)){
	int i;
	m.clear();
	sum = 0;
	memset(pre,0,sizeof(pre));
	memset(late,0,sizeof(late));
	
	for(i=1;i<=n;i++){
		scanf("%I64d",&a[i]);
		if(!m[a[i]])
			m[a[i]] = i;
	}
	pre[m[a[1]]] ++ ;
	for(i=2;i<=n;i++)
	    late[m[a[i]]] ++ ; 
	for(i=2;i<n;i++){
		late[m[a[i]]] -- ;
		double t = a[i]*1.0 / k;
		long long x = t;
		if(t != x){
			pre[m[a[i]]] ++ ;
			continue ;
		}
		sum += pre[m[x]] * late[m[x*k*k]] ;
		pre[m[a[i]]] ++ ;
	}
	printf("%I64d
",sum);
} 

return 0;

}

原文地址:https://www.cnblogs.com/jxgapyw/p/4749495.html