• 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;
    

    }

  • 相关阅读:
    原生JS 碰撞检测
    sdw
    无题
    什么是递归?递归大讲义
    C#中常用的经典文件操作方法
    rpm包时遇到Header V3 DSA signature: NOKEY时解决办法
    Linux vim命令
    Linux yum命令详解
    visual studio 2013 快捷键大全
    D_S 线性表的顺序表示和实现
  • 原文地址:https://www.cnblogs.com/jxgapyw/p/4749495.html
Copyright © 2020-2023  润新知