zoukankan      html  css  js  c++  java
  • codeforce 1501C

    codeforce 1501 C

    题意

    (n)个数字((n < 2*10^5)),他们的大小在([1,2.5*10^6]).

    在其中找(4)个数字,他们符合(a+b=c+d).

    做法

    情况1

    首先用一个大小(2.5*10^6)的数组,记录每个数字出现的次数.

    如果出现次数大于(2)的数字有两个或以上,那么他们就是答案.

    如果有一个数字出现次数在四次或以上,那么他也是答案.

    如果没有出现

    转换式子

    [a+b=c+d\ a-d=c-b ]

    所以找到两对数字((a,d))((c,b)),他们之间的差相等.

    显然他们是(aleq dleq c leq b)的.

    将所给的数字排序,求出他们相邻之间的差,得到(n-1)个数字.像这样

    1 2 2 4 5 7 ->

    1 0 2 1 1

    也用一个大小为(2.5*10^6)的数组,记录得到的这(n-1)个差出现的次数.

    如果找到一个差,出现两次以上,那么就说明我们找到了这两对差值相同的数字.

    根据这个差值去扫描一次排序后的数字,就能找到这两对数字了.

    但是你找到的这两对数字((a,d))((c,b)),可能(d)(c)是同一个数字.就像这样

    1 2 3 ->

    1 1

    这样就只能看下面一种情况了.

    如果以上都没有出现

    如果他们完全不满足以上的情况.那么说明只给了不超过(n<2*10^3)个数字.

    为什么?

    如果要满足相邻数字之间的差各不相同,那就要有(n-1)个不同的差.

    所以给的数字里面最大的一个数字至少是(n-1)个不同的差的和.

    这个最大数字不超过(2.5*10^6),可见(n)的数量很小.

    既然数字则么少,可以用两趟循环随便找,也不会超过时间限制.

  • 相关阅读:
    C++中Map的使用 (个人简单的对于String的使用)
    具体数学二项式至生成函数章-----致敬Kunth
    C++中String的使用
    C++中Set的使用
    费马小定理,欧拉函数
    数论---同余法则定理
    灵活利用单链表,顺带一提可持久化链表。
    第2章 数字之魅——数字中的技巧
    Mail.Ru Cup 2018 Round 1
    Lyft Level 5 Challenge 2018
  • 原文地址:https://www.cnblogs.com/zzidun-pavo/p/14530263.html
Copyright © 2011-2022 走看看