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;
}
总结
同向双指针用于维护一个区间不走回头路
而反向双指针与之不同
注意要维护的到底是什么

浙公网安备 33010602011771号