zoukankan      html  css  js  c++  java
  • Codeforces Round #Pi (Div. 2) —— C-Geometric Progression

    题意:

    如今有n个数,然后给出一个数k(代表的是等比数列中的那个公比),然后第二行给出n个数,代表的是这个序列。

    最后的问题是叫你找出在这个序列中满足公比为k的三个数有几种。并输出方案总数。

    思路:

    这道题非常巧妙啊,用到了map。

    首先我们先记录下每种数出现过了几次。这里由于数太大了。直接用数组存会爆掉,所以改用map。

    我们须要两个map,分别记为mp1。mp2. 

    然后在for的过程中。我们是以当前的那个数为第二项,然后去寻找它的mp1[a[i]*k](也就是第三项)。寻找它的mp2[a[i]/k](也就是第一项)。

    这里为什么先找第一项,然后第二,三项呢?用样例来说吧:1 1 1; 由于假设我们找了第一项。那么最后的结果为2(也就是1出现过的次数)。所以这样的解法是不正确的。

    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<queue>
    #include<map>
    #include<stack>
    using namespace std;
    #define me rng_58
    #define maxn 200011
    typedef __int64 ll;
    ll a[maxn];
    map<ll,ll> mp1,mp2;
    int main(){
    	int n,k;
    	ll sum=0;
    	scanf("%d%d",&n,&k);
    	mp1.clear();
    	mp2.clear();
    	for(int i=1;i<=n;i++){
    		scanf("%I64d",&a[i]);
    		mp1[a[i]]++;
    	}
    	//以a[i]为中间项;
    	//mp1记录的是a[i]后面有几个。mp2记录a[i]前面有几个; 
    	for(int i=1;i<=n;i++){
    		mp1[a[i]]--;
    		if(a[i]%k==0)			//!
    		sum+=mp1[a[i]*k]*mp2[a[i]/k];
    		mp2[a[i]]++;
    	}
    	printf("%I64d
    ",sum);
    }
    /*
    4 1
    3 3 3 3
    */


  • 相关阅读:
    C#飞行棋总结
    用python+pygame写贪吃蛇小游戏
    光线步进——RayMarching入门
    EasyX库进行图片绘制函数
    Unity复杂的旋转-欧拉角和四元数
    MATLAB GUI制作快速入门
    Three.js模型隐藏或显示
    Qt 为QPushButton、QLabel添加鼠标移入移出事件
    Unity c# 状态机的简单入门
    JavaFX Chart设置数值显示
  • 原文地址:https://www.cnblogs.com/mthoutai/p/6916128.html
Copyright © 2011-2022 走看看