[プログラミングの質問] KongLianshunを予期せず逮捕

件名
私の名前はワンダフイです。私はエージェントです。私はちょうどタスクを受け取りました:Bytedance Streetで待ち伏せし、テロリストのKongLianshunを逮捕します。私と一緒に働いている他の2人のエージェントがいます、私は提案します

  1. ByteDanceStreetのN棟の建物の中から3つの待ち伏せ場所を選択しました。
  2. お互いに気を配るために、最も離れた2つのエージェント間の距離がDを超えないようにすることを決定しました。

私は天才です!慎重に計算した後、X個の可能な待ち伏せ計画の1つを選択しました。この計画は誰にでもできる、震える、Kong Lianshunです!
...
意外にも、計画はまだ失敗しました。KongLianshunは小さなドラゴンの女の子として作り上げ、コスプレチームのByteDanceStreetを脱出しました。彼の変装の唯一の責任は非常に成功し、楊過自身でさえそれを見つけることができなかったでしょう!

質問を聞いてください:N(待ち伏せポイントとして選択できる建物の数)、D(最も離れている2つのエージェント間の最大距離)、およびオプションの建物の座標が与えられた場合、この操作で計算します、大ハンマーチームが持っている待ち伏せオプションの数。
注意:

  1. 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;
}

おすすめ

転載: blog.csdn.net/qq_43530773/article/details/114422487