当前位置:网站首页>洛谷P1102 A-B数对(二分,map,双指针)
洛谷P1102 A-B数对(二分,map,双指针)
2022-07-06 09:25:00 【是小张张呀 zsy】
简单A-B
描述
这是一道简单题,给出一串数以及一个数字C,要求计算出所有A - B = C的数对的个数(不同位置的数字一样的数对算不同的数对)。
输入
输入共两行。
第一行,两个整数N, C。1=<N<=2e5 , C>=1
第二行,N个整数,作为要求处理的那串数。
输出
一行,表示该串数中包含的满足A - B =C的数对的个数。
输入样例 1
4 1
1 1 2 3
输出样例 1
3
输入样例 2
6 1
1 1 1 2 2 2
输出样例 2
9
本题值得注意的是,有可能暴int
比如
输入
200000 1
1e5个1,1e5个2
输出
1e10 > int型
(int存最大的数约等于2e9)
二分
简单二分模板题
先排序,找出比第i个数大C的最左端点的坐标和最右端点的坐标,(右端点坐标减去左端点坐标加1)就表示有多少个比第i个数大C
例如样例2中
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int const N=2e5+10;
int n,c,a[N];
ll res;
int main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
//节约cin,cout时间;
cin>>n>>c;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+1+n);
for(int i=1;i<=n;i++)
{
int l=i+1,r=n;
while(l<r) //找最左端点;r=mid;
{
int mid=l+r >>1;
//相当于(l+r)/2,这么写看着厉害一点hh,+优先级大于>>(右移)优先级;
if(a[mid]-a[i]>=c)
r=mid;
else
l=mid+1;
}
int k=l;
l=i+1,r=n;
while(l<r)//找最右端点;l=mid;
{
int mid=l+r+1 >> 1;//改l,要+1,防止死循环
if(a[mid]-a[i]<=c)
l=mid;
else
r=mid-1;
}
int kk=l;
if(a[kk]-a[i]==c&&a[k]-a[i]==c)
res+=kk-k+1;
}
cout<<res<<endl;
return 0;
}
lower_bound()
upper_bound()
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int const N=2e5+10;
int n,c,a[N],b[N];
ll res;
int main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
//节约cin,cout时间;
cin>>n>>c;
for(int i=1;i<=n;i++)
{
cin>>a[i];
b[i]=a[i]+c;//用b[N]数组存(对应的)的大C的值
}
sort(a+1,a+1+n);
for(int i=1;i<=n;i++)
{
int k=lower_bound(a+1,a+n+1,b[i])-a;//返回第一个大于等于b[i]的a数组的下标
int kk=upper_bound(a+1,a+n+1,b[i])-a;//返回大于
res+=kk-k;//因为upper_bound返回大于的下标,所以无需加1
}
cout<<res<<endl;
return 0;
}
双指针
具体的实现就是,我们维护两个端点kk , k,每次kk右移到a[kk] - a[i] <= c
的最后位置的下一位,k右移到满足a[k] - a[l] < c
最后一位.
也就是说, 此时如果a[kk] - a[i] == c && a[k] - a[i] == c
,中间的那一段一定都是满足条件的,我们让res += kk - k
即可。
#include <bits/stdc++.h>
using namespace std;
int const N=200010;
typedef long long ll;
int a[N],n,c;
ll res;
int main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
//节约cin,cout时间;
cin>>n>>c;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+1+n);
int kk=2,k=2;
for(int i=1;i<=n;i++)
{
while(kk<=n&&a[kk]-a[i]<=c)
kk++; //因为是有序的,下次寻找从kk开始;减少不必要的枚举
while(k<=n&&a[k]-a[i]<c)
k++;
if(a[kk-1]-a[i]==c&&a[k]-a[i]==c)
res+=kk-k;
}
cout<<res<<endl;
return 0;
}
MAP 时间复杂度O(n)
#include<iostream>
#include<cstring>
#include<algorithm>
#include<map> //map头文件;
using namespace std;
typedef long long ll;
int const N=2e5+10;
int n,c,a[N],b[N];
ll res;
map<int,int> mp;//key-value;建立一个数字到出现次数的映射 map<a[i],times>
int main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
//节约cin,cout时间;
cin>>n>>c;
for(int i=1;i<=n;i++)
{
cin>>a[i];
mp[a[i]]++;
}
sort(a+1,a+1+n);
for(int i=1;i<=n;i++)
{
res+=mp[a[i]+c];
}
cout<<res<<endl;
return 0;
}
边栏推荐
- Research Report on market supply and demand and strategy of geosynthetics industry in China
- ucore lab7
- ArrayList集合
- STM32学习记录:玩转按键控制蜂鸣器和LED
- Learning record: Tim - capacitive key detection
- Research Report on market supply and demand and strategy of China's Medical Automation Industry
- Intensive learning notes: Sutton book Chapter III exercise explanation (ex17~ex29)
- STM32 learning record: play with keys to control buzzer and led
- 编程到底难在哪里?
- Cost accounting [13]
猜你喜欢
FSM and I2C experiment report
学习记录:USART—串口通讯
TCP的三次握手与四次挥手
STM32學習記錄:輸入捕獲應用
FSM和i2c实验报告
学习记录:如何进行PWM 输出
Knowledge that you need to know when changing to software testing
Word macro operation: convert the automatic number in the document into editable text type
Crawling cat's eye movie review, data visualization analysis source code operation instructions
Do you know the performance testing terms to be asked in the software testing interview?
随机推荐
UCORE lab5 user process management experiment report
China's salt water membrane market trend report, technological innovation and market forecast
ArrayList集合
China earth moving machinery market trend report, technical dynamic innovation and market forecast
STM32学习记录:玩转按键控制蜂鸣器和LED
Cost accounting [14]
Stm32 dossiers d'apprentissage: saisie des applications
STM32 learning record: play with keys to control buzzer and led
STM32学习记录:LED灯闪烁(寄存器版)
CSAPP shell lab experiment report
Cost accounting [16]
STM32 learning record: input capture application
毕业才知道IT专业大学生毕业前必做的1010件事
FSM and I2C experiment report
C4D quick start tutorial - Introduction to software interface
MATLAB实例:阶跃函数的两种表达方式
51 lines of code, self-made TX to MySQL software!
C语言数组的概念
Market trend report, technical innovation and market forecast of Chinese hospital respiratory humidification equipment
Cost accounting [13]