题目传送门(内部题108)


输入格式

  输入文件第一行为两个正整数$n,M$。
  接下来两行,第一行为$n$个正整数$a_1\sim a_n$,其中$a_i$表示编号为$i$的男生的实力值;第二行为$n$个正整数$b_1\sim b_n$,其中$b_i$表示编号为$i$的女生的实力值。


输出格式

  输出一个整数,为最少的小组数量。输入数据保证至少存在一种满足分组规则的分组方式。


样例

样例输入:

3 50
6 7 2
6 3 5

样例输出:

2


数据范围与提示

  对于$10\%$的数据,满足$n\leqslant 10$。
  对于$30\%$的数据,满足$n\leqslant 1,000$。
  对于$50\%$的数据,满足$n\leqslant 10,000$。
  对于$70\%$的数据,满足$n\leqslant 100,000$。
  对于$100\%$的数据,满足$n\leqslant 500,000,1\leqslant a_i,b_i\leqslant 100,000,1\leqslant M\leqslant 10^{15}$。


题解

先来考虑一种接近正解的做法,对于当前的左端点,二分右端点的位置,然后$judge$。

但是算一算时间复杂度发现并不对,最极限的数据就是每一组都只有一个人,那么时间复杂度就是$\Theta(n^2\log^2n)$的了。

考虑优化,可以先利用倍增求出范围,即为如果$l+2^p$可以,但是$l+2^{p+1}$不可以,然后再在这段区间内进行二分即可。

因为无论是倍增还是二分,都只将整个序列$judge$了$k$遍,这里$k$只是一个很小的常数,所以复杂度就是对的了。

注意不要被$a_i,b_i$的值域迷惑,千万不要使用桶排,因为对于这种算法,桶排的时间复杂度还是$\Theta(n^2\log^2n)$级别的。

时间复杂度:$\Theta(n\log^n)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
int n;
long long M;
int a[500001],b[500001],qa[500001],qb[500001];
int ans;
bool judge(int l,int r)
{
long long res=0;
for(int i=l;i<=r;i++){qa[i]=a[i];qb[i]=b[i];}
sort(qa+l,qa+r+1);sort(qb+l,qb+r+1);
for(int i=l;i<=r;i++){res+=1LL*qa[i]*qb[i];if(res>M)return 0;}
return 1;
}
int main()
{
scanf("%d%lld",&n,&M);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
for(int i=1;i<=n;i++)
scanf("%lld",&b[i]);
int now=1;
while(now<=n)
{
ans++;
int lft=0,rht=0,res=now;
while(1)
{
if(now+(1<<rht)>n)break;
if(!judge(now,now+(1<<rht)))break;
lft=rht;rht++;
}
lft=now+(1<<lft);
rht=min(now+(1<<rht),n);
while(lft<=rht)
{
int mid=(lft+rht)>>1;
if(judge(now,mid)){lft=mid+1;res=mid;}
else rht=mid-1;
}
now=res+1;
}
nxt:;
printf("%d",ans);
return 0;
}

rp++

[CSP-S模拟测试]:分组配对(倍增+二分)的更多相关文章

  1. 联赛模拟测试22 B. 分组配对 倍增+二分

    题目描述 分析 首先,容易发现一个小组内的最优配对方式(能得到最大综合实力的方式) 一定是实力值最大的男生和最大的女生配对,次大的和次大的配对,以此类推. 但是每次新插入一个值时,需要用 \(nlog ...

  2. [CSP-S模拟测试]:C(倍增+数学)

    题目传送门(内部题152) 输入格式 第一行两个整数$N,Q$. 接下来一行$N$个整数,第$i$个为$a_i$. 接下来的$N-1$行,每行两个整数$u,v$.表示$u,v$之间有一条边. 接下来的 ...

  3. [CSP-S模拟测试]:中间值(二分)

    题目背景 $Maxtir$喜欢序列的中间值. 题目传送门(内部题127) 输入格式 第一行输入两个正整数$n,m$,其中$m$是操作和询问次数. 接下来两行每行输入$n$个非负整数,每一行分别表示两个 ...

  4. 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组

    2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...

  5. csp-s模拟测试96

    csp-s模拟测试96 $T1$一眼慢速乘,$T2$稍证一手最优性尝试用神奇数据结构优化,无果,弃.$T3$暴力+信仰. 100 03:16:38 95 03:16:56 35 03:17:10 23 ...

  6. [考试反思]1031csp-s模拟测试96:常态

    按照smily的说法这一场的大众分暴力分是不是265啊QwQ那我可真是个大垃圾 总算还是回归了常态. T3文件名写错,把“city.in”写成“city,in” 还好,只丢了20分. T2乱打$O(n ...

  7. [CSP-S模拟测试96]题解

    以后不能再借没改完题的理由不写题解了…… A.求和 求$\sum \sum i+j-1$ 柿子就不化了吧……这年头pj都不考这么弱智的公式化简了…… 坑点1:模数不定,可能没有2的逆元,那么只要先把乘 ...

  8. [2018冬令营模拟测试赛(二十一)]Problem A: Decalcomania

    [2018冬令营模拟测试赛(二十一)]Problem A: Decalcomania 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见&quo ...

  9. [考试反思]1003csp-s模拟测试58:沉淀

    稳住阵脚. 还可以. 至少想拿到的分都拿到了,最后一题的确因为不会按秩合并和线段树分治而想不出来. 对拍了,暴力都拍了.挺稳的. 但是其实也有波折,险些被卡内存. 如果内存使用不连续或申请的内存全部使 ...

随机推荐

  1. 从入门到自闭之Python自定义模块

    自定义模块 定义:一个文件就是一个模块(能被调用的文件,模块就是一个工具箱,工具就是函数) 作用: 将代码文家化管理,提高可读性,避免重复代码 拿来就用(避免重复造轮子),python中类库比较多,提 ...

  2. solr学习笔记-入门

    solr学习笔记 1.安装前准备 solr依赖java 8 运行环境,所以我们先安装java.如果没有java环境无法启动solr服务,并且会看到如下提示: [root@localhost solr- ...

  3. Codeforces 1228C. Primes and Multiplication

    传送门 当然是考虑 $n$ 的每个质数 $p$ 对答案的贡献 考虑 $p^k$ 在 $[1,m]$ 中出现了几次,显然是 $\left \lfloor \frac{m}{p^k} \right \rf ...

  4. leecode刷题(27)-- 合并k个排序链表

    leecode刷题(27)-- 合并k个排序链表 合并k个排序链表 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1-> ...

  5. 公司SQL考核及小结(Oracle)

    一.数据库初始化脚本: Create TABLE HAND_CUSTOMERS ( CUSTOMERS_NO ), CUSTOMERS_NAME ), CUSTOMERS_GENDER ), CUST ...

  6. SpringBoot + Vue + nginx项目部署(零基础带你部署)

    一.环境.工具 jdk1.8 maven spring-boot idea VSVode vue 百度网盘(vue+springboot+nginx源码): 链接:https://pan.baidu. ...

  7. Spring整合Hessian访问远程服务

    声明:该文章转载自Spring整合Hessian访问远程服务,本人搬过来只是为了记录下学习Hessian的过程,忘此博主理解,在此感谢,等本人有能力了再学一些原创的东东,本人实践了下,hessianS ...

  8. Reference to ‘xxxxx’ is ambiguous 错误

    1.原因,在当前类重复引入了 类库,比如 pch里面导入了#import "XXX" 此类的.h 又引入 #import <xxx/xxx> 导致 解决方法:删除此类的 ...

  9. Go语法的基本使用(三)

    // 长度 vs 容量. // 长度是目前里面有几个值 // 容量是最多能放多少个值 func main(){ var a =make(chan int,4) a<-1 a<-2 a< ...

  10. SQL SERVER 中 sp_rename 用法

    转自:http://www.cnblogs.com/no7dw/archive/2010/03/04/1678287.html 因需求变更要改表的列名,平常都是跑到Enterprise manager ...