luoguP1102-双指针
题目链接:P1102 A-B 数对 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
利用单调性求解
双指针解法:排序构造出区间单调,则若存在目标值B,B在序列中一定为连续区间,此时通过双指针 l 和 r ,此时维护一段区间:有S[L]大于S[I] -C,S[R]大于等于S[I] - C,此时我们枚举每一位,若存在A-B=C关系,则将对应目标区域加入答案中,反之则遍历下一位
题目:
出题是一件痛苦的事情!
相同的题目看多了也会有审美疲劳,于是我舍弃了大家所熟悉的 A+B Problem,改用 A-B 了哈哈!
题目描述
给出一串正整数数列以及一个正整数 C,要求计算出所有满足A−B=C 的数对的个数(不同位置的数字一样的数对算不同的数对)。
输入格式
输入共两行。
第一行,两个正整数 N,C。
第二行,N 个正整数,作为要求处理的那串数。
输出格式
一行,表示该串正整数中包含的满足 A−B=C 的数对的个数。
输入输出样例
输入 #1
4 1 1 1 2 3
输出 #1
3
说明/提示
对于 75% 的数据,1≤ N ≤ 2000。
对于 100%的数据,1≤ N ≤ 2×1e5,0≤ ai < 2^30,1 ≤ C < 2^30。
2017/4/29 新添数据两组
ACcode:
#include <bits/stdc++.h> using namespace std; const int N = 2 * 1e5 + 10; typedef long long LL; int n, c, s[N]; LL sum; int main() { cin >> n >> c; for(int i = 0; i < n; ++ i) cin >> s[i]; sort(s, s + n); int l = 0, r = 0; for(int i = 0; i < n; ++ i) { while(s[l] < s[i] - c && l < n) ++ l;/ while(s[r] <= s[i] - c && r < n) ++ r; if(s[i] - s[l] == c) sum += r - l; } cout << sum << endl; return 0; }
当时解法:用额外数组计算枚举数组中每位数字出现的次数,遍历每一位,若满足A-B=C,则把对应的值加入答案中,40分