万万没想到之抓捕孔连顺
编程思路:编程时不能利用三重循环来计算,否则程序时间复杂度过大,加上数据量大,会超时。所以计算时采用定点思维,由第一个点以D为单位向后推进,每个定位点到他后边D范围利用排列组合任取3个点进行计算(不利用排列组合逐个去求必然超时)。
#include <iostream>
using namespace std;
int main()
{
int N,D,bulidings[1000000+5];
long outcome=0;
cin>>N>>D;
for(int i=0; i<N; i++)
cin>>bulidings[i];
for(int i=0,j=1; i<N-2; i++)
{
while(j<N&&bulidings[++j]-bulidings[i]<=D); //用来判断此位置到距离为D的位置中间有多少建筑
j--;
if(j-i>=2)
outcome+=(long long)(j-i)*(long long)(j-i-1)/2;//已知两点间建筑数,求
outcome%99997867; //根据题目要求,防止溢出
}
cout<<outcome%99997867;
return 0;
}