件名
私の名前はワンダフイです。私はエージェントです。私はちょうどタスクを受け取りました:Bytedance Streetで待ち伏せし、テロリストのKongLianshunを逮捕します。私と一緒に働いている他の2人のエージェントがいます、私は提案します
- ByteDanceStreetのN棟の建物の中から3つの待ち伏せ場所を選択しました。
- お互いに気を配るために、最も離れた2つのエージェント間の距離がDを超えないようにすることを決定しました。
私は天才です!慎重に計算した後、X個の可能な待ち伏せ計画の1つを選択しました。この計画は誰にでもできる、震える、Kong Lianshunです!
...
意外にも、計画はまだ失敗しました。KongLianshunは小さなドラゴンの女の子として作り上げ、コスプレチームのByteDanceStreetを脱出しました。彼の変装の唯一の責任は非常に成功し、楊過自身でさえそれを見つけることができなかったでしょう!
質問を聞いてください:N(待ち伏せポイントとして選択できる建物の数)、D(最も離れている2つのエージェント間の最大距離)、およびオプションの建物の座標が与えられた場合、この操作で計算します、大ハンマーチームが持っている待ち伏せオプションの数。
注意:
- 2人のエージェントが同じ場所で待ち伏せすることはできません
- 3つのエージェントは同等です。つまり、同じ場所の組み合わせ(A、B、C)は待ち伏せ方法にすぎず、「エージェント間で場所を交換する」ために再利用することはできません。
説明を入力してください
第一行包含空格分隔的两个数字 N和D(1 ≤ N ≤ 1000000; 1 ≤ D ≤ 1000000)
第二行包含N个建筑物的的位置,每个位置用一个整数(取值区间为[0, 1000000])表示,从小到大排列(将字节跳动大街看做一条数轴
出力の説明
一个数字,表示不同埋伏方案的数量。结果可能溢出,请对 99997867 取模
例
输入
4 3
1 2 3 4
输出
4
说明
可选方案 (1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)
説明
この問題は、スライディングウィンドウで解決できます。
最初に、人の位置の1つを固定するように設定して、残りの2人が適切な位置を見つけることができるようにします。
したがって、アイデアは次のとおりです。
最初に右端の添え字iで1人を修正し、次に最も遠いが適切な距離点j内を見つけ、残りの2つは残りの点(ji)で適切であるため、n *(n -1)/ 2の可能性、
次に左端が動き始め、アピールプロセスを繰り返します
コード
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long n,d,res=0;
cin>>n>>d;
long long a[n];
for (long long i = 0, j = 0; i < n; i++)
{
//输入新的读数同时也是定下新的最右边界
cin>>a[i];
//寻找合适的最左边界
while (i >= 2 && (a[i] - a[j]) > d)
j++;
res +=(i - j-1) * (i - j) / 2;
}
cout<<res%99997867;
return 0;
}