想好左右界,以及边界可以整除的情况。
注意,左界可能存在小于ai的情况,这种是不合法的。
/*
* 20171128
*/
#include <cstdio>
#include <algorithm>
using namespace std;
#define maxn 100010
int n;
long long x,k;
long long num[maxn];
int main()
{
scanf("%d%I64d%I64d",&n,&x,&k);
for(int i=0;i<n;i++) scanf("%I64d",&num[i]);
sort(num,num+n);
long long ans = 0;
for(int i=0;i<n;i++)
{
long long t = num[i]%x;
long long left,right;
if(t==0)
{
left = max(num[i],num[i]+k*x-x);
right = num[i]+k*x;
}else
{
left = max(num[i],num[i]+k*x-t);
right = num[i]+k*x+x-t;
}
ans+=(lower_bound(num,num+n,right)-lower_bound(num,num+n,left));
}
printf("%I64d\n",ans);
return 0;
}
本文介绍了一种基于数组排序和二分查找的区间划分算法,该算法用于计算在给定条件下合法区间的数量。通过调整左右边界来确保每个区间都符合特定的约束条件。
1075

被折叠的 条评论
为什么被折叠?



