关注

AT_cpsco2019_s4_c Make a Team

传送门

题目描述

拉斯克同学所在的大学的编程俱乐部有 N N N 个人,第 i i i 位成员的能力值为 R i R_i Ri

为了去参加大学的编程比赛,我们决定从编程俱乐部的部员中挑选出 3 3 3 个人组成 1 1 1 个队伍。

在这里,我们还有一个要求,让团队中能力值最高的人和最低的人的能力值的差在 D D D 以下。

请你帮我求一下这样的团队有多少种。

输入格式

输入为以下形式为标准输入给出。

N N N D D D R 1 R_1 R1 R 2 R_2 R2 … \ldots R N R_N RN

输出格式

输出满足条件的队伍有几种。

请注意,答案可能不属于 32 32 32 位整数类型。

样例 #1

样例输入 #1

5 400
300 700 1000 800 500

样例输出 #1

3

样例 #2

样例输入 #2

3 1000
2000 2000 4000

样例输出 #2

0

样例 #3

样例输入 #3

6 314159265
358979323 846264338 327950288 419716939 93751058 209749445

样例输出 #3

7

输入输出样例 #1

输入 #1

5 400
300 700 1000 800 500

输出 #1

3

输入输出样例 #2

输入 #2

3 1000
2000 2000 4000

输出 #2

0

输入输出样例 #3

输入 #3

6 314159265
358979323 846264338 327950288 419716939 93751058 209749445

输出 #3

7

说明/提示

制约

  • 输入都是整数。
  • 3   ≤   N   ≤   10 5 3\ \leq\ N\ \leq\ 10^5 3  N  105
  • 1   ≤   D   ≤   10 9 1\ \leq\ D\ \leq\ 10^9 1  D  109
  • 1   ≤   R i   ≤   10 9 1\ \leq\ R_i\ \leq\ 10^9 1  Ri  109

题意

要从有 N N N 个成员的编程俱乐部中选出 3 3 3 人组成队伍,要求队伍中能力值最高和最低的差值不超过 D D D,要求这样的团队有多少。

思路

暴力复杂度为 Θ ( N 3 ) \Theta (N^3) Θ(N3),肯定不能暴力。

我们采用双指针法:

  • 首先预处理:将所有成员的能力值从小到大排序。
  • 排序后,任意区间 [ i , j ] [i,j] [i,j] 内的成员,最小值是 a i a_i ai,最大值是 a j a_j aj,则只判断 a j − a i ≤ D a_j−a_i \le D ajaiD 即可。
  • 接着,用两个指针 i , j i,j i,j 遍历 i i i 时,将 j j j 向右移动到最大的满足条件的位置。
  • 最后,对于合法区间 [ i , j ] [i,j] [i,j] 计算组合数即可求出该区间的方案数。

代码

注意: 答案可能不属于 32 32 32 位整数类型。

通过记录

转载自CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/Lsq_MAX_4869/article/details/158390974

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--