CF600B Queries about less or equal elements 题解 二分

题目链接:http://codeforces.com/problemset/problem/600/B

题目大意:
给你一个长度为 \(n\) 的数组 \(a[]\) 和一个长度为 \(m\) 的数组 \(b[]\) 。
对于数组 \(b[]\) 中的每一个元素 \(b_j\) ,你需要计算出 \(a[]\) 中有多少元素 \(a_i\) 是满足 \(a_i \le b_j\) 的。

解题思路:
本题涉及算法:二分。
需要先将数组 \(a[]\) 排序,然后对于每一个 \(b_j\) ,二分查找大于等于 \(b_j\) 的最小的那个数。
实现代码如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 200020;

int n, m, a[maxn], b[maxn];

int main() {
    cin >> n >> m;
    for (int i = 0; i < n; i ++) cin >> a[i];
    for (int i = 0; i < m; i ++) cin >> b[i];
    sort(a, a+n);
    for (int i = 0; i < m; i ++) {
        if (i) putchar(' ');
        int L = 0, R = n-1, res = -1;
        while (L <= R) {
            int mid = (L + R) / 2;
            if (a[mid] <= b[i]) {
                res = mid;
                L = mid + 1;
            } else {
                R = mid - 1;
            }
        }
        cout << res + 1;
    }
    cout << endl;
    return 0;
}

当然,我们也可以使用 STL 的 upper_bound 函数来实现(upper_bound 函数返回大于某一个元素的最小的那个数的地址),实现的代码如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 200020;

int n, m, a[maxn], b[maxn];

int main() {
    cin >> n >> m;
    for (int i = 0; i < n; i ++) cin >> a[i];
    for (int i = 0; i < m; i ++) cin >> b[i];
    sort(a, a+n);
    for (int i = 0; i < m; i ++) {
        if (i) putchar(' ');
        int id = upper_bound(a, a+n, b[i]) - a;
        cout << id;
    }
    cout << endl;
    return 0;
}

原文地址:https://www.cnblogs.com/quanjun/p/12191307.html

时间: 2024-10-09 23:09:25

CF600B Queries about less or equal elements 题解 二分的相关文章

cidefirces Educational Codeforces Round 2 B Queries about less or equal elements

B. Queries about less or equal elements You are given two arrays of integers a and b. For each element of the second array bj you should find the number of elements in array a that are less than or equal to the value bj. Input The first line contains

CF 600B Queries about less or equal elements --- 二分查找

CF 600B 题目大意:给定n,m,数组a(n个数),数组b(m个数),对每一个数组b中的元素,求数组a中小于等于数组该元素的个数. 解题思路:对数组a进行排序,然后对每一个元素b[i],在数组a中进行二分查找第一个大于b[i]的位置即为结果 /* CF 600B Queries about less or equal elements --- 二分查找 */ #include <cstdio> #include <algorithm> using namespace std;

[ 题解 ] [ 二分+模拟 ] E. Convention

http://codeforces.com/group/NVaJtLaLjS/contest/238203/problem/E 题意: 农夫的N只牛会在N[i]时间到达机场,农夫准备了M辆大巴去接.每辆大巴能载C只牛.(MC≥N) 问对于一只牛最小的最长等待时间是多少. 示例: Input: 6 3 2 1 1 10 14 4 3 Output: 4 你要明确这里要搜索什么.既然题目问的是等待时间,我们就搜索这个等待时间:不要想着怎样给这N个数据套M个区间,太复杂了. 搜索用二分,109不是开玩

CF251A Points on Line 题解 二分

题目链接:http://codeforces.com/problemset/problem/251/A 题目描述 一条直线上有 \(n\) 个点,他们的坐标分别是 \(x_1,x_2, \cdots ,x_n\) .没有两个点的坐标相同. 你可以从这些点中挑选出三个点,使得三个点的最大距离不超过 \(d\) . 请求出满足条件的三个点的方案数. 输入格式 输入的第一行包含两个整数 \(n\) 和 \(d\) ( \(1 \le n \le 10^5; 1 \le d \le 10^9\) ).

2017-5-22-Train:Educational Codeforces Round 2

B. Queries about less or equal elements(二分) You are given two arrays of integers a and b. For each element of the second array b**j you should find the number of elements in array athat are less than or equal to the value b**j. Input The first line c

【题解】绝地求生

题目描述 小飞最近迷上了一个叫绝地求生的游戏.不过他的技术并不好,假设他的战斗力是x.不过,他的战斗力是由心情来定的,每天都不同.现有一群(1≤n≤100000)也是玩绝地求生的朋友,他们也有战斗力.小飞想找一些比自己强的人玩,提高自己的战斗力,如:小烨,小祖,小明等. 小飞一共玩了m天,假设其他人的战斗力不变.问:小飞每天可以找到多少比自己强的人. 输入输出格式 输入格式 第一行,输入一个n,表示有n个朋友:(1≤n≤100000) 第二行输入n个朋友的战斗力:每个朋友战斗力不超过long i

【题解】木材加工

题目描述 木材厂有一些原木,现在想把这些木头切割成一些长度相同的小段木头(木头有可能有剩余),需要得到的小段的数目是给定的.当然,我们希望得到的小段越长越好,你的任务是计算能够得到的小段木头的最大长度.木头长度的单位是cm.原木的长度都是正整数,我们要求得到的小段木头的长度也是正整数. 输入输出格式 输入格式 第一行是两个正整数N和K(1≤N≤100000,1≤K≤200000),N是原木的数目,K是需要得到的小段的数目.接下来的N行,每行有一个1到10000之间的正整数,表示一根原木的长度L.

【题解】探险

题目描述 n个同学一起去探险,现在把n个同学分成k个小组,每个小组完成一项探险任务.分组时,如果第i人到第j人分在同一组(i小于j),则他们之间的所有人(第i+1,i+2,...,j-1个)也必须在同一个小组中. 一个小组内所有人的体力和越小,途中可能越危险.为了确保每个同学的安全,要求分组时,使得所有小组中,体力和最小的那个小组的所有人的体力和尽量大. 依次告诉你每个人的体力,如何分组呢? 输入输出格式 输入格式 第一行,两个正整数n和k,互相之间以一个空格分隔. 第2行,n个正整数(互相以一

【题解】跳石头

题目描述 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有N块岩石(不含起点和终点的岩石).在比赛过程中,选手们将从起点出发,每一步跳向相邻的岩石,直至到达终点. 为了提高比赛难度,组委会计划移走一些岩石,使得选手们在比赛过程中的最短跳跃距离尽可能长.由于预算限制,组委会之多从起点到终点之间移走M块岩石(不能移走起点和终点的岩石). 输入输出格式 输入格式 第一行,三个整数L,N,