Loading

P1102 A-B 数对

题目分析

显然是一道双指针的题目 分析维护区间的特点
对于数列中的一个数 \(A\)
要求 \(B = A - C\) 可以发现 \(B\) 一定在一个连续区间内
双指针维护这个连续区间
先对这个数列排序 使得每次移动 \(A\) 时, 区间必定单向移动, 避免了走回头路
算法复杂度: \(O(N)\)

代码

#include <bits/stdc++.h>
const int MAXN = 2e5 + 5;

#define calc(a, b) Num[b] - Num[a]
#define int long long

int N, C;
int Num[MAXN];

bool cmp(int a, int b);

/*
双指针:
首先将主指针遍历 在主指针移动时 移动辅助指针使得 差值 <= C 当等于时记录答案
*/
void Two_Pointers()
{
    int Left_Pointers = 1, Right_Pointers = 1;
    int Pair_Sum = 0;
    for (int i = 1; i <= N && Left_Pointers <= N && Right_Pointers <= N; i++)
    {
        int Now_Num = Num[i];

        while(Num[Left_Pointers] < Now_Num - C)
        {
            Left_Pointers++;
        }
        while (Num[Right_Pointers] <= Now_Num - C)
        {
            Right_Pointers++;
        }

        Pair_Sum += Right_Pointers - Left_Pointers;
    }

    printf("%lld", Pair_Sum);
}

signed main()
{

    scanf("%lld %lld", &N, &C);
    for (int i = 1; i <= N; i++)
    {
        scanf("%lld", &Num[i]);
    }

    std::sort(Num + 1, Num + N + 1, cmp);

    Two_Pointers();

    return 0;
}

bool cmp(int a, int b)
{
    return a < b;
}

总结

同向双指针用于维护一个区间不走回头路
而反向双指针与之不同
注意要维护的到底是什么

posted @ 2024-09-28 10:48  Yorg  阅读(64)  评论(0)    收藏  举报