二分学习

题目描述

给定2个数组a、b以及一个整数x

判断是否存在a[i]+b[j]=x

输入

第一行:两个整数n、m (1<n、m<10000)

第二行:n个整数,为数组a

第三行:m个整数,为数组b

第四行:一个整数k (1<k<20),表示k次查询

接下来的k行:每行一个整数x

输出

若数组a中存在一个a[i],数组b中存在一个b[j],使得a[i]+b[j]=x,则输出Yes

如不存在,则输出No

样例输入

2 3
1 2
3 4 5
4
1
4
5
8

样例输出

No
Yes
Yes
No
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 using namespace std;
 5 const int maxn = 1e5+7;
 6 int a[maxn], b[maxn];
 7 int query(int *arr, int l, int r, int key){
 8     while(l <= r){
 9         int mid = (l + r) >> 1;
10         if(arr[mid] == key) return mid;
11         if(arr[mid] < key) l = mid + 1;
12         else r = mid - 1;
13     }
14     return -1;
15 }
16 int main()
17 {
18     int n, m, k;
19     scanf("%d%d",&n,&m);
20     for(int i = 0; i < n; i++)scanf("%d",&a[i]);
21     for(int i = 0; i < m; i++)scanf("%d",&b[i]);
22     cin >> k;
23     sort(a, a + n);sort(b, b + m);
24     int q;
25     while(k--){
26         cin >> q;
27         int flag = 1;
28         for(int i = 0; i < n; i++){
29             int y = q - a[i];
30             //cout << y << endl;
31             if(y > 0){
32                 int pos = query(b, 0, m, y);
33                 if(pos != -1){
34                     cout << "Yes" << endl;
35                     flag = 0;
36                     break;
37                 }
38             }
39
40         }
41         if(flag == 1){
42             cout << "No" << endl;
43         }
44     }
45     return 0;
46 }

670 D2

The term of this problem is the same as the previous one, the only exception — increased restrictions.

Input

The first line contains two positive integers n and k (1?≤?n?≤?100?000,?1?≤?k?≤?10^9) — the number of ingredients and the number of grams of the magic powder.

The second line contains the sequence a1,?a2,?...,?an (1?≤?ai?≤?10^9), where the i-th number is equal to the number of grams of the i-th ingredient, needed to bake one cookie.

The third line contains the sequence b1,?b2,?...,?bn (1?≤?bi?≤?10^9), where the i-th number is equal to the number of grams of the i-th ingredient, which Apollinaria has.

Output

Print the maximum number of cookies, which Apollinaria will be able to bake using the ingredients that she has and the magic powder.

Examples

input

1 100000000011000000000

output

2000000000

input

10 11000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 10000000001 1 1 1 1 1 1 1 1 1

output

0

input

3 12 1 411 3 16

output

4

input

4 34 3 5 611 12 14 20

output

3
 1 #include <iostream>
 2 #include <cstdio>
 3 #define ll long long
 4 using namespace std;
 5 const int maxn = 1e5+7;
 6 ll a[maxn], b[maxn];
 7
 8 int main()
 9 {
10     ll n, k;
11     while(~scanf("%lld%lld",&n,&k)){
12         for(int i = 0; i < n; i++)scanf("%lld",&a[i]);
13         for(int i = 0; i < n; i++)scanf("%lld",&b[i]);
14         ll mid, sum, flag, l = 0, r = 2e9+10;
15         while(l <= r){
16             mid = (l + r) >> 1;
17             sum = 0;flag = 1;
18             for(int i = 0; i < n; i++){
19                 if(a[i]*mid > b[i]){
20                     sum += a[i]*mid - b[i];
21                 }
22                 if(sum > k){
23                     flag = 0;
24                 }
25             }
26             //cout << l << ‘ ‘ << r << endl;
27             if(flag) l = mid + 1;
28             else r = mid - 1;
29         }
30         printf("%lld\n",l - 1);
31     }
32
33     return 0;
34 }
				
时间: 2024-10-24 07:36:06

二分学习的相关文章

【cdq分治】cdq分治与整体二分学习笔记Part1.整体二分

之所以把cdq分治和整体二分放在一起学习,是因为他们两个实在太像了-不管是做法还是代码- 感觉整体二分可能会比cdq分治稍微简单那么一点点?所以先学整体二分.(感觉他们的区别在于整体二分是对每个操作二分答案,cdq是分治了操作序列) 整体二分是对答案进行二分,其具体操作如下: (比如以ZJOJ2013K大数查询为例) 具体过程 Step1.从(L,R)二分答案.mid=(L+R)>>1,用线段树维护原序列中(a,b)位置比mid大的数有多少个,同时记录对序列的操作分别是什么操作. Step2.

整体二分学习

这大概是我目前学过的最难理解的知识点了吧( 概述 整体二分,意味着同时二分一切 这个算法适用于静态和动态区间第\(k\)大,以及一些区间询问问题.那么根据通常的思路,让我们先来介绍一下暴力,再来分析二者的区别. 静态区间第k大 让我们暴力地二分答案来做,应该怎么做呢?既然我们要求区间第\(k\)大,那么区间中就应该有\(k-1\)个数比答案大才对.所以我们二分答案\(mid\),看看序列里有多少个比它小的数,然后缩小值域. 想象一下,如果对于每一个询问操作我们都这样做,会\(T\)成什么样子.对

【从零学习经典算法系列】分治策略实例——二分查找

1.二分查找算法简介 二分查找算法是一种在有序数组中查找某一特定元素的搜索算法.搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束:如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较.如果在某一步骤数组 为空,则代表找不到.这种搜索算法每一次比较都使搜索范围缩小一半.折半搜索每次把搜索区域减少一半,时间复杂度为Ο(logn). 二分查找的优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且

算法学习一~分治法~二分查找,快速的找~

现在编程也算是走上门了,但是没有把算法掌握下来只能说自己还是门外汉,所以以后我们就开始努力的学习算法,现在把自己每天的学习分享在这里希望大家能喜欢,并且我也要在这里整理我一天的学习和思路,. 二分查找..大家经常需要在一个数组中寻找某个值.如果是一个已经拍好序的话那么可以很快的找到.我们考虑下暴力查找,就是a[n],中找一个m,那么最好时是o(1),最差时是0(n),最终平均情况就是长度n/2.这样的时间复杂度不算很高但是可以改进到logn的级别. 1 #include<stdio.h>//算

javascript学习6-练习之3二分查找算法

二分查找算法,对数据进行查找并且显示位置. 核心思想:将所查找数据与查询数组中间的数进行比较,findVal<midVal,则在左边进行二分查找,否则在右边进行二分查找递归调用 具体代码如下: 1 //二分查找 2 var string2=[1,3,42,88,123,143]; 3 var leftIndex=0; 4 var rightIndex=5; 5 function binarySearch(string2,findVal,leftIndex,rightIndex) 6 { 7 if

算法学习01:二分查询,选择法、插入法、分治法排序

查询与排序是使用的再频繁不过的两个功能,算法学习系列实现语言为C#. 一般情况下的查询 Int32 Search(Int32[] source, Int32 task) { var index = 0; while (index < source.Length) if (source[index++] == task) return index - 1; //返回值为Length则说明未找到 return source.Length; } 时间复杂度为O(n),在检索源没有排序的情况下,这即为最

java数据结构学习(一)之二分查找

  二分查找法与我们在孩童时期玩过的猜数的游戏一样,这个游戏里一个朋友会让你猜他正想的一个1至100的数,当你猜了一个数后,他会告诉你三种选择的一个:你猜的比她想的大,或小,或猜中了.为了能用最少的次数猜中,必须从50开始猜,如果她说你猜的太小,则推出那个数在51-100之间,所以下一次猜75((51+100)/2),如果她说有些大,那你就会在51-74之间才,下一次猜(51+74)/2=62.直到猜中她所给的数. 下面给出我们猜1-100的数,key为33的过程: 只需7次就可以猜中答案.下面

八大排序算法学习笔记:插入排序(二分插入排序)

二分插入排序   也称折半插入排序, 1.基本思想:设数列[0....n]分为两部分一部分是[0...i]为有序序列,另一部分是[i+1.....n]为无序序列,从无序序列中取一个数 x ,利用二分查找算法找到 x 在有序序列中的插入位置并插入,有序序列还是有序的,接下来重复上述步骤,直到无序序列全部插入有序序列 ,这是整个序列只剩下有序序列即有序了. 2.代码:    3.复杂度: 用二分插入排序所要进行的总比较次数为O(lgn),当n较大时,比直接插入排序的最大比较次数小得多,但大于最小比较

在路上---学习篇(一)Python 数据结构和算法 (5)二分查找、二叉树遍历

独白: 利用算法进行查找指定元素,最近学习二分查找和二叉树遍历.二分查找前提是在有序中进行查找,二叉树引入了树的概念.树的概念其中有许多小知识点,也是一种新的数据结构.还是之前的感悟,需了解其本质才会写出更好的算法. 二分查找 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用