J - Sockets

Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u

Valera has only one electrical socket in his flat. He also has m devices which require electricity to work. He's got n plug multipliers to plug the devices, the i-th plug multiplier has ai sockets.

A device or plug multiplier is supplied with electricity if it is either plugged into the electrical socket, or if it is plugged into some plug multiplier which is supplied with electricity.

For each device j, Valera knows the safety value bj which is the maximum number of plug multipliers on the path between the device and the electrical socket in his flat. For example, if bj = 0, the device should be directly plugged into the socket in his flat.

What is the maximum number of devices Valera could supply with electricity simultaneously? Note that all devices and plug multipliers take one socket to plug, and that he can use each socket to plug either one device or one plug multiplier.

Input

The first line contains two space-separated integers n and m (1 ≤ n, m ≤ 2·105), the number of plug multipliers and the number of devices correspondingly.

The second line contains n space-separated integers a1a2, ..., an (2 ≤ ai ≤ 2·105). Here, the number ai stands for the number of sockets on the i-th plug multiplier.

The third line contains m space-separated integers b1b2, ..., bm (0 ≤ bj ≤ 2·105). Here, the number bj stands for the safety value of the j-th device.

Output

Print a single integer: the maximum number of devices that could be supplied with electricity simultaneously.

Sample Input

Input

3 5
3 2 2
1 2 2 1 1

Output

4

Input

3 3
2 2 2
1 2 2

Output

3

题意:给你N个插排,a[i]代表第i个插排上面插孔的个数;接着给你M个电器,b[i]代表第i个电器最多能承受的级联层数,然后让你求出最多能有个电器同时工作?
题解:贪心+二分,插排按插孔的个数从大到小排序,电器按所能承受的级联层数从大到小排序,接着在[1,m]的区间内二分答案即可。
二分的判断主要是看当前区间内(1,mid)的电器能否全部都插在插排上面,如果满足条件,就把当前的mid记录下来。
代码:
 #include <iostream>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <map>
#include <set>
#include <bitset>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <string>
#include <sstream>
#define push_back pb
#define make_pair mp
#define lson l,m,rt*2
#define rson m+1,r,rt*2+1
#define mt(A) memset(A,0,sizeof(A))
#define mod 1000000007
using namespace std;
typedef long long LL;
const int N=+;
const LL INF=0x3f3f3f3f3f3f3f3fLL;
LL a[N],b[N],n,m;
bool check(LL num)//判断(1.num)内的电器能否全部工作
{ //cnt代表的是当前还没有工作的电器的个数
LL cnt=num,i=,tot=,step=;//step代表级联的层数,初始状态当然为0;
while(true) //tot代表的是当前剩余的插孔的个数
{
while(cnt>=&&b[cnt]<=step)//如果电器的级联层数满足条件,就插上插排
{
cnt--;tot--;
}
if(cnt<&&tot>=)return true;//如果电器插完了,插孔>=0,那说明(1,num)是满足的
if(tot<)return false;//插孔<0说明不满足
LL newtot=;
while(tot&&i<=n)//更新插孔的个数
{
newtot+=a[i++];
tot--;
}
tot+=newtot;
step++;//级联层数每次增加一层
}
}
int main()
{
#ifdef Local
freopen("data","r",stdin);
#endif
LL i,j,k,l,r,mid,ans;
cin>>n>>m;
for(i=;i<=n;i++)cin>>a[i];
for(i=;i<=m;i++)cin>>b[i];
sort(a+,a+n+,greater<LL>());
sort(b+,b+m+,greater<LL>());
l=;r=m;
while(l<=r)
{
mid=(l+r)/;
if(check(mid))
{
ans=mid;//记录答案
l=mid+;
}
else r=mid-;
}
cout<<ans<<endl;
return ;
}
 

Code Forces Gym 100886J Sockets(二分)的更多相关文章

  1. Gym 100886J Sockets 二分答案 + 贪心

    Description standard input/outputStatements Valera has only one electrical socket in his flat. He al ...

  2. Code Forces Gym 100971D Laying Cables(单调栈)

    D - Laying Cables Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u ...

  3. Code Forces 796C Bank Hacking(贪心)

    Code Forces 796C Bank Hacking 题目大意 给一棵树,有\(n\)个点,\(n-1\)条边,现在让你决策出一个点作为起点,去掉这个点,然后这个点连接的所有点权值+=1,然后再 ...

  4. 思维题--code forces round# 551 div.2

    思维题--code forces round# 551 div.2 题目 D. Serval and Rooted Tree time limit per test 2 seconds memory ...

  5. Code Forces 833 A The Meaningless Game(思维,数学)

    Code Forces 833 A The Meaningless Game 题目大意 有两个人玩游戏,每轮给出一个自然数k,赢得人乘k^2,输得人乘k,给出最后两个人的分数,问两个人能否达到这个分数 ...

  6. K - Video Reviews Gym - 101755K (二分)

    题目链接: K - Video Reviews Gym - 101755K 题目大意: 一家公司想让个人给他们的产品评论,所以依次去找这个人,第i个人会评论当且仅当已经有个人评论或他确实对这个产品感兴 ...

  7. Gym - 101908G Gasoline 二分+最大流

    G - Gasoline Gym - 101908G 题意:给出R个提供点,P个接收点,每个接收点都要接收满,还有一个运输的时间,问最小时间能够完成所有的运输 题解:首先每次都必须要满流,所以我们只要 ...

  8. B - Glider Gym - 101911B(二分)

    output standard output A plane is flying at a constant height of hh meters above the ground surface. ...

  9. J - Joseph and Tests Gym - 102020J (二分+线段树)

    题目链接:https://cn.vjudge.net/contest/283920#problem/J 题目大意:首先给你n个门的高度,然后q次询问,每一次询问包括两种操作,第一种操作是将当前的门的高 ...

随机推荐

  1. 【java版坦克大战---准备篇】 java 绘图

    要写坦克大战当然要先画出坦克.java画图是基础. package com.game; import java.awt.*; import javax.swing.*; public class Pr ...

  2. sirius的学习笔记(3)

    毕业论文什么的终于搞完了,重拾我的python Creating the python skeleton project directory $ mkdir project $ cd project ...

  3. PHP javascript 值互相引用(不用刷新页面)

    PHP javascript 值互相引用的问题   昨天通过EMAIL给一些公司投了简历,希望他们能给我一份工作,今天其中一家公司的人给我打电话,大意是要我做一点东西(与AJAX有关) 给他们看,我听 ...

  4. linux vi 使用

    vi 有一般模式和编辑模式 如vi test.txt 是首先进入的一般模式,一般模式下只能进行复制.删除.粘贴文件数据, 在一般模式下按i .I.a.A.o.O 都能进入编辑模式,按下不同的键进入编辑 ...

  5. 2015年9月29日 sql 触发器

    触发器(trigger):当有关联操作的时候使用(级联操作),属于ddl关键字. eg:下订单时,创建中的商品数量要减少:退票时,总的票数要增加.         在订单上建立触发器         ...

  6. delphi xe5 android 手机上使用sqlite

    本篇我们介绍一下在android手机上怎样使用sqlite数据库,这里用Navigator实现 增删改查. 1.新建firemonkey mobile application 2.选择blank ap ...

  7. Log4j与common-logging

    Log4j与common-logging 总网上搜了些Log4j与common-logging的介绍,记录下. 一.Log4j  1.简介 Log4j是Apache的一个开放源代码项目 使用Log4j ...

  8. ACdream训练赛系列のJava专场

    /* * this code is made by mhy12345 * Problem: 1669 * Verdict: Accepted * Submission Date: 2015-04-21 ...

  9. Stanford CoreNLP--Named Entities Recognizer(NER)

    Standford Named Entities Recognizer(NER),命名实体识别是信息提取(Information Extraction)的一个子任务,它把文字的原子元素(Atomic ...

  10. 深入浅出Z-Stack 2006 OSAL多任务资源分配机制

    转自深入浅出Z-Stack 2006 OSAL多任务资源分配机制 一.概述 OSAL (Operating System Abstraction Layer),翻译为"操作系统抽象层&quo ...