luoguP1102-双指针
  JJUgyxdf1Vmf 2024年04月04日 46 0

题目链接: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,要求计算出所有满足AB=C 的数对的个数(不同位置的数字一样的数对算不同的数对)。

输入格式

输入共两行。

第一行,两个正整数 N,C。

第二行,N 个正整数,作为要求处理的那串数。

输出格式

一行,表示该串正整数中包含的满足 AB=C 的数对的个数。

输入输出样例

输入 #1
4 1
1 1 2 3
输出 #1
3

说明/提示

对于 75% 的数据,1≤ ≤ 2000。

对于 100%的数据,1≤  ≤ 2×1e5,0≤ ai​ 2^30,1  ≤ 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分

这里二分存sum爆int了,双指针为什么可过?

 

 

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2024年04月04日 0

暂无评论

推荐阅读