首页 > 其他分享 >luoguP1102-双指针

luoguP1102-双指针

时间:2024-04-04 14:23:08浏览次数:25  
标签:题目 int luoguP1102 ++ 1e5 正整数 指针

题目链接: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分

 

标签:题目,int,luoguP1102,++,1e5,正整数,指针
From: https://www.cnblogs.com/OVSolitario-io/p/18114166

相关文章

  • 代码随想录DAY1 | 二分,双指针移除元素
    代码随想录DAY1|二分,双指针移除元素题目描述给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。示例1:输入:nums=[-1,0,3,5,9,12],target=9输出:4解释:9出现在nums中并且......
  • C语言——深入理解指针
    1.数组名的理解实数组名就是数组⾸元素(第⼀个元素)的地址,但是有两个例外:•sizeof(数组名),sizeof中单独放数组名,这⾥的数组名表⽰整个数组,计算的是整个数组的⼤⼩,单位是字节•&数组名,这⾥的数组名表⽰整个数组,取出的是整个数组的地址(整个数组的地址和数组⾸元素的......
  • 37.深⼊理解指针(2)
    1.数组名的理解intarr[10]={1,2,3,4,5,6,7,8,9,10};int*p=&arr[0];这⾥我们使⽤&arr[0]的⽅式拿到了数组第⼀个元素的地址,但是其实数组名本来就是地址,⽽且是数组⾸元素的地址,我们来做个测试。#include<stdio.h>intmain(){intarr[10]={1,2,3,4,5,6,......
  • C语言------------指针
    指针的类型:指针:在学习指针之前,要有一个认知,那就是指针==地址;指针的基本使用:​​这里要注意三点:1.*标识符—————只产生在指针变量定义或声明的时候;2.指针的类型要和被赋值的类型一致;3.*p=*(p)这2个的意思是一样的;在scanf中,不能使用指针进行;上面的是最基......
  • Linux C++ 015-对象模型和this指针
    LinuxC++015-对象模型和this指针本节关键字:Linux、C++、对象模型、this指针相关库函数:成员变量和成员函数分开存储1、在C++中,类内的成员变量和成员函数分开存储,只有非静态成员变量才属于类的对象上;2、C++编译器会给每个空对象也分配一个字节的空间,是为了区分空对象占......
  • 双指针法
    1、基本概念双指针主要分为以下三种:普通的指针:两个指针往一个方向移动对撞指针:一般是在有序的情况下两个指针进行面对面的移动,适合解决约束条件的一组元素问题以及字符串反转问题快慢指针:定义两个指针,一个快指针一个慢指针,用于判断是否为环或者长度的问题很方便通过一个快......
  • 用函数指针变量做参数,求最大值、最小值和两数之和
    include<stdio.h>include<stdlib.h>include<malloc.h>intmax(int,int);intmin(int,int);intadd(int,int);voidprocess(int,int,int(fun)(int,int));voidmain(){inta,b;scanf("%d%d",&a,&b);process(a,b,max);process(a,......
  • C语言——指针
    地址是由物理的电线上产生的,能够标识唯一一个内存单元。在C语言中,地址也叫做指针。在32位机器中,有32根地址线。地址是由32个0/1组成的二进制序列,也就是用4个字节来存储地址。在64位机器中,有64根地址线。地址是由64个0/1组成的二进制序列,也就是用8个字节来存储地址。指针类型......
  • C语言 指针
    目录1.指针是什么?2.指针和指针类型2.1指针的解引用2.2指针加减整数3.野指针3.1指针未初始化3.2指针越界访问4.指针运算4.1指针加减整数4.2指针减指针4.3指针的关系运算5.指针和数组例1 例26.二级指针7.指针数组8.结语1.指针是什么?把内存单一的编号就......
  • 双指针妙解三数之和
    三数之和算是名气很大的算法题,我今天刚好刷到,用JavaScript实现了一下。题目如下所示:Givenanintegerarraynums,returnallthetriplets[nums[i],nums[j],nums[k]]suchthati!=j,i!=k,andj!=k,andnums[i]+nums[j]+nums[k]==0.Noticethatthesolut......