思路:二分找到不比当前值加差值打的最后一个数字,然后讨论
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <cstdio> #include <iostream> #include <cmath> #include <algorithm> #include <cstring> #include <map> using namespace std; long long node[100010]; int fun(int l,int r,long long x) { if(l>=r) return l; int mid=(l+r)/2; if(node[mid]==x) return mid; if(node[mid]<x) return fun(mid+1,r,x); return fun(l,mid-1,x); } int main() { int n,k; cin>>n>>k; for(int i=1;i<=n;i++) cin>>node[i]; long long ans=0; long long tmp; long long cnt=1; for(int i=1;i<=n;i++) { tmp=fun(cnt,n,node[i]+k); while(node[tmp]>node[i]+k) tmp--; cnt=tmp; tmp-=(i+1); if(tmp>=2) ans+=tmp*(tmp-1)/2; if(tmp>=1) ans+=tmp; } cout<<ans<<endl; return 0; }