upper_bound和lower_bound的用法
首先介绍这两种函数是什么意思
upper_bound是找到大于t的最小地址,如果没有就指向末尾
lower_bound是找到大于等于t的最小地址
题目链接:https://vjudge.net/contest/231314#problem/E
You are given n integers a1, a2, ..., an. Find the number of pairs of indexes i, j (i < j) that ai + aj is a power of 2 (i. e. some integer x exists so that ai + aj = 2x).
Input
The first line contains the single positive integer n (1 ≤ n ≤ 105) — the number of integers.
The second line contains n positive integers a1, a2, ..., an (1 ≤ ai ≤ 109).
Output
Print the number of pairs of indexes i, j (i < j) that ai + aj is a power of 2.
Examples
4
7 3 2 1
2
3
1 1 1
3
Note
In the first example the following pairs of indexes include in answer: (1, 4) and (2, 4).
In the second example all pairs of indexes (i, j) (where i < j) include in answer.
题目大意:输入n,代表有n个数,接下来有n个数,问你两个数相加的和是2的整数次幂的个数
个人思路:觉得这道题并不难,然后自己写一遍超时了(没有用二分查找),然后改为用二分,还是超时,这就有有点难受了,后来实在不知道
哪里可以优化,只能百度了
先看一下自己超时的代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<stdio.h>
#include<string.h>
#include<cmath>
#include<math.h>
#include<algorithm>
#include<set>
#include<queue>
typedef long long ll;
using namespace std;
const ll mod=1e9+;
const int maxn=1e5+;
const ll maxa=1e10;
#define INF 0x3f3f3f
ll b[];
//#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
void solve()
{
ll p=;
for(int i=;i<=;i++)
{
p*=;
b[i]=p;
}
}
bool judge(ll n,int l,int r)
{
int mid=(l+r)/;
while(l<=r)
{
if(n>b[mid])
{
l=mid+;
}
else if(n<b[mid])
r=mid-;
else if(n==b[mid])
return true;
mid=(l+r)/;
}
return false;
}
int main()
{
solve();
ll ans=;
ll a[maxn];
int n;
//cin>>n;
scanf("%d",&n);
for(int i=;i<n;i++)
scanf("%lld",&a[i]);
//cin>>a[i];
for(int i=;i<n;i++)
{
for(int j=i+;j<n;j++)//其实这里也是可以优化的,自己没想到罢了
{
if(judge(a[i]+a[j],,))
ans++;
}
}
printf("%lld\n",ans);
// cout<<ans<<endl;
return ;
}
然后看一下ac 代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<stdio.h>
#include<string.h>
#include<cmath>
#include<math.h>
#include<algorithm>
#include<set>
#include<queue>
typedef long long ll;
using namespace std;
const ll mod=1e9+;
const int maxn=1e5+;
const ll maxa=1e10;
#define INF 0x3f3f3f
ll b[];
//#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
void solve()
{
ll p=;
for(int i=;i<=;i++)
{
p*=;
b[i]=p;
}
}
int main()
{
solve();
ll ans=,tmp;
ll a[maxn];
int n;
//cin>>n;
scanf("%d",&n);
for(int i=;i<n;i++)
scanf("%lld",&a[i]);
sort(a,a+n);
//cin>>a[i];
for(int i=;i<n;i++)//只要遍历一遍就够了
{
for(int j=;j<=;j++)
{
tmp=b[j]-a[i];//tmp是剩下的那个数
if(tmp>)
ans+=upper_bound(a+i+,a+n,tmp)-lower_bound(a+i+,a+n,tmp);//大于tmp的数的下标减去大于等于tmp的数的下标,就知道有没有等于tmp的数了
}
}
printf("%lld\n",ans);
// cout<<ans<<endl;
return ;
}
关于lower_bound和upper_bound的第二种用法
int t=lower_bound(a,a+n,k)-a 返回第一个大于等于k的下标,如果k比数组里面所有的数都大,就返回a+n,如果k比所有数都小,返回第一个元素下标
int t=upper_bound(a,a+n,k)-a 返回第一个大于k的下标,如果k比数组所有元素都大,就返回a+n,如果k比所有数都小,返回第一个元素下标
题目链接:https://vjudge.net/contest/231315#problem/D
Vasiliy likes to rest after a hard work, so you may often meet him in some bar nearby. As all programmers do, he loves the famous drink "Beecola", which can be bought in n different shops in the city. It's known that the price of one bottle in the shop i is equal to xi coins.
Vasiliy plans to buy his favorite drink for q consecutive days. He knows, that on the i-th day he will be able to spent mi coins. Now, for each of the days he want to know in how many different shops he can buy a bottle of "Beecola".
Input
The first line of the input contains a single integer n (1 ≤ n ≤ 100 000) — the number of shops in the city that sell Vasiliy's favourite drink.
The second line contains n integers xi (1 ≤ xi ≤ 100 000) — prices of the bottles of the drink in the i-th shop.
The third line contains a single integer q (1 ≤ q ≤ 100 000) — the number of days Vasiliy plans to buy the drink.
Then follow q lines each containing one integer mi (1 ≤ mi ≤ 109) — the number of coins Vasiliy can spent on the i-th day.
Output
Print q integers. The i-th of them should be equal to the number of shops where Vasiliy will be able to buy a bottle of the drink on the i-th day.
Example
5
3 10 8 6 11
4
1
10
3
11
0
4
1
5
Note
On the first day, Vasiliy won't be able to buy a drink in any of the shops.
On the second day, Vasiliy can buy a drink in the shops 1, 2, 3 and 4.
On the third day, Vasiliy can buy a drink only in the shop number 1.
Finally, on the last day Vasiliy can buy a drink in any shop.
题目大意:输入n,代表有n个商店,下面n个数代表每个商店卖酒的价格,输入m,接下来m个数,代表有多少前,问每一次能在多少个商店买酒
超快能解决,用upper_bound
先把所有的商店价格按从小到大排序,然后找到第一个大于自己拥有钱的下标就行了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<stdio.h>
#include<string.h>
#include<cmath>
#include<math.h>
#include<algorithm>
#include<set>
#include<queue>
typedef long long ll;
using namespace std;
const ll mod=1e9+;
const int maxn=1e5+;
const ll maxa=1e10;
#define INF 0x3f3f3f3f3f3f
int main()
{
ll n,m,mo;
ll a[maxn];
cin>>n;
for(ll i=;i<n;i++)
cin>>a[i];
sort(a,a+n);
cin>>m;
for(int i=;i<=m;i++)
{
cin>>mo;
cout<<(upper_bound(a,a+n,mo)-a)<<endl;
}
return ;
}
upper_bound和lower_bound的用法的更多相关文章
- 【刷题记录】 && 【算法杂谈】折半枚举与upper_bound 和 lower_bound
[什么是upper_bound 和 lower_bound] 简单来说lower_bound就是你给他一个非递减数列[first,last)和x,它给你返回非递减序列[first, last)中的第一 ...
- upper_bound()与lower_bound()的使用
upper_bound()与lower_bound()的使用 c++中的许多库函数可以使我们的代码量大大减少,也可使问题简单化.很早之前就接触了upper_bound()与lower_bound(), ...
- [C++] upper_bound和lower_bound
upper_bound 源码 template <class ForwardIterator, class T> ForwardIterator upper_bound (ForwardI ...
- 【模板】关于vector的lower_bound和upper_bound以及vector基本用法 STL
关于lower_bound和upper_bound 共同点 函数组成: 一个数组元素的地址(或者数组名来表示这个数组的首地址,用来表示这个数组的开头比较的元素的地址,不一定要是首地址,只是用于比较的& ...
- 二分查找、upper_bound、lower_bound
整理及总结二分查找的判断和边界细节 修改版 package com.leej.binarysearch; import java.util.Arrays; /** * @author jerry * ...
- upper_bound()和lower_bound()
ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)算法返回一个非递减序列[first, la ...
- C++中二分法之upper_bound()、lower_bound、binary_search()函数
前言 数组.容器vector都适用,在头文件"algorithm"中 下面的例子是针对容器的,注意返回的是距离元素3最近的指针it,输出的是*it结果为元素4,假如我想得到位置而非 ...
- 关于lower_bound()的用法--NYOJ 201作业题
lower_bound它有三个参数, 第一个和第二个是给定区间起点和终点的指针,第三个参数是要查找的数,它的作用原理是在给定的区间中进行二分查找,这个二分区间是前开后闭的,他返回第一个大于等于它的函数 ...
- lower_bound && upper_bound
用lower_bound进行二分查找 ●在从小到大排好序的基本类型数组上进行二分查找. 这是二分查找的一种版本,试图在已排序的[first,last)中寻找元素value.如果[first,last ...
随机推荐
- 洛谷【P2005】A/B Problem II
题目传送门:https://www.luogu.org/problemnew/show/P2005 高精除低精:https://www.cnblogs.com/AKMer/p/9724556.html ...
- cmdb1--介绍
背景:现在运维管理服务器多数使用Excel表来维护,而且是多人来维护,造成信息不统一,所以要将信息入库,并方便后续的批量操作 1.cmdb主要分3块: a.采集信息程序 b.API提供接口 c.后台管 ...
- chromedriver下载
https://www.cnblogs.com/vickey-wu/p/6629407.html
- Python selenium 三种等待方法
1. 强制等待 sleep(xx) 是最简单粗暴的一种办法,不管你浏览器是否加载完了,程序都得等待3秒,3秒一到,继续执行下面的代码,作为调试很有用,不建议总用这种等待方式,严重影响程序执行速度. 代 ...
- ES6学习之Generator函数
概念:可以把Generator 函数理解成状态机(封装了多个内部状态)或者是一个遍历器对象生成函数 写法:Generator函数的定义跟普通函数差不多,只是在function关键字后面加了一个星号 f ...
- C#自定义控件 绘制框
上几张测试的 效果 虽然全是用.net 的绘图库画的,但是手动双缓冲,不会闪烁,感觉还不错,源码开放了,喜欢的拿去扩展吧; 用于撤销的存放图像的数据结构我设置为10个,怕是内存崩了,我看mspaint ...
- linux日常管理-top动态查看负载
动态查看负载命令,具体哪个程序,哪个进程造成的系统负载. top 回车查看 3秒更新一次 第一行和uptime和w第一行显示的一样. CPU使用率,us sy 内存相关,Mem 一共多少,使用了多少, ...
- XML解析,出现ClassCastException 原因
import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.Docum ...
- p3627&bzoj1179 抢掠计划(ATM)
传送门(洛谷) 传送门(bzoj) 题目 Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruser i 银行的 ATM 取款机.令人奇怪的 ...
- Struts2学习第七课 result
result 是action节点的子节点 result 代表action方法执行后,可能去的一个目的地 一个action节点可以配置多个result子节点. result的name属性值对应着acti ...