联赛模拟测试22 B. 分组配对 倍增+二分
题目描述



分析
首先,容易发现一个小组内的最优配对方式(能得到最大综合实力的方式)
一定是实力值最大的男生和最大的女生配对,次大的和次大的配对,以此类推.
但是每次新插入一个值时,需要用 \(nlogn\) 的时间复杂度去维护这个最大实力值
如果暴力去扩展时间效率是无法接受的
然后我们会发现答案具有单调性,可以枚举一个左区间,然后二分查找右区间
但是当遇到每一组的人数很小的情况时,二分会被卡成 \(n^2 logn\)
因此我们需要先用倍增处理出二分的区间
在处理出的区间里进行二分查找
这样,当实际组大小是\(k\)时,时间复杂度应为\(O(klog^2k)\)
则总时间复杂度不超过\(O(nlog^2n)\)
代码
#include<cstdio>
#include<set>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<cstring>
#define rg register
inline int read(){
rg int x=0,fh=1;
rg char ch=getchar();
while(ch<'0' || ch>'9'){
if(ch=='-') fh=-1;
ch=getchar();
}
while(ch>='0' && ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*fh;
}
const int maxn=5e5+5;
int n,a[maxn],b[maxn],cnt,c[maxn],d[maxn];
long long m;
bool jud(int l,int r){
rg long long nans=0;
rg int ncnt=0;
for(rg int i=l;i<=r;i++){
c[++ncnt]=a[i];
d[ncnt]=b[i];
}
std::sort(c+1,c+1+ncnt);
std::sort(d+1,d+1+ncnt);
for(rg int i=1;i<=ncnt;i++){
nans+=1LL*c[i]*d[i];
}
return nans<=m;
}
int main(){
n=read();
scanf("%lld",&m);
for(rg int i=1;i<=n;i++){
a[i]=read();
}
for(rg int i=1;i<=n;i++){
b[i]=read();
}
rg int head=1,now=0;
while(head<=n){
cnt++;
now=0;
while(1){
if(head+(1<<now)-1>n || !jud(head,head+(1<<now)-1)) break;
now++;
}
rg int nl=head+(1<<(now-1))-1,nr=head+(1<<(now))-1,nmids;
nr=std::min(n,nr);
while(nl<=nr){
nmids=(nl+nr)>>1;
if(jud(head,nmids)) nl=nmids+1;
else nr=nmids-1;
}
head=nr+1;
}
printf("%d\n",cnt);
return 0;
}
联赛模拟测试22 B. 分组配对 倍增+二分的更多相关文章
- 联赛模拟测试22 D. 简单计算
题目描述 分析 \(\sum_{i=0}^p[(p|qi)?0:1]=\sum_{i=0}^p[(p/gcd(p,q)|qi/gcd(p,q))?0:1]=\sum_{i=0}^p[(p/gcd(p, ...
- 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组
2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...
- [考试反思]0815NOIP模拟测试22
40分,15名. 1-4:120 75 70 70 35分20名...总之差距极小不想说了 昨天教练说:以后的考试还是联赛知识点,但是难度比联赛高. 没听进去,以为是对于所有人而言的,也就是T1难度变 ...
- 联赛模拟测试14 A. 虎
题目描述 这题太虎了,所以没有背景. 给你一棵树,边有黑白两种颜色,你每次可以选择两个点,把这两个点之间的唯一简单路径上的所有边颜色取反,某些边要求最终颜色必须是黑色,还有些边没有要求,问最少操作多少 ...
- 联赛模拟测试17 A. 简单的区间 启发式合并
题目描述 分析 我们要找的是一段区间的和减去该区间的最大值能否被 \(k\) 整除 那么对于一段区间,我们可以先找出区间中的最大值 然后枚举最大值左边的后缀与最大值右边的前缀之和是否能被 \(k\) ...
- 联赛模拟测试18 A. 施工 单调队列(栈)优化DP
题目描述 分析 对于 \(Subtask\ 1\),可以写一个 \(n^3\) 的 \(DP\),\(f[i][j]\) 代表第 \(i\) 个建筑高度为 \(j\) 时的最小花费,随便转移即可 时间 ...
- 联赛模拟测试20 C. Weed
题目描述 \(duyege\) 的电脑上面已经长草了,经过辨认上面有金坷垃的痕迹. 为了查出真相,\(duyege\) 准备修好电脑之后再进行一次金坷垃的模拟实验. 电脑上面有若干层金坷垃,每次只能在 ...
- 联赛模拟测试24 B. 答题 折半枚举
题目描述 分析 暴力的思想是把 \(2^n\) 种得分枚举出来,每一种得分的概率都是相同的,然后从小到大累加,直到大于等于所给的概率 把问题转化一下,就变成了在 \(2^n\) 种元素中求 \(k\) ...
- 联赛模拟测试25 C. Repulsed 贪心+树形DP
题目描述 分析 考虑自底向上贪心 \(f[x][k]\) 表示 \(x\) 下面距离为 \(k\) 的需要灭火器的房间数,\(g[x][k]\) 表示 \(x\) 下面距离为 \(k\) 的多余灭火器 ...
随机推荐
- python身体指数BMI
问题需求 既要输出国际标准也要输出国内标准
- Django ContentType(ORM操作)
ContentType-设计课程表 # 数据: """ 免费课:Python入门 学位课:Python全栈 价格策略: Linux入门 7 0 Python入门 7 0 ...
- golang slice学习
关于获取slice相关内存地址操作 s := make([]int, 1) t.Log(unsafe.Pointer(&s))// 获取当前slice 结构体实例的内存地址 t.Log(uns ...
- @Embedded 和 @Embeddable
自定义类型在hibernate中实现自定义类型,需要去实现UserType接口即可或者以Component的形式提供. JPA的@Embedded注解有点类似,通过此注解可以在Entity模型中使用一 ...
- C++ (C#)实现获取NX PART预览图
VS环境下 C++版本: 1 int GetPreviewImage(const TCHAR* prtFile, const TCHAR* imageFile) 2 { 3 IStorage* pSt ...
- Swiper 在IE9 及其他浏览器使用
Swiper 在IE9 及其他浏览器使用 前言 昨天遇到一个问题,swiper 使用版本是3.4.2 除了Ie9浏览器外其他浏览器都正常,IE9 无法轮播,执行控制台报错源码问题.没办法,只能降级兼容 ...
- php+html实现用户登录退出
随着渗透学习,逐渐意识到了学会开发也是非常重要的,仅仅是看懂感觉还是差了一些,所以写一写php的开发,这套程序目前并未有较完整的功能,之后会不断进行完善 登录页面.html <!DOCTYPE ...
- @ComponentScan比较
ComponetScan 定义扫描规则 value:指定要扫描的包 excludeFilters=Filter[] 指定扫描的时候按照什么规则排除哪些组件. includeFilters=Filter ...
- tomcat源码--springboot整合tomcat源码分析
1.测试代码,一个简单的springboot web项目:地址:https://gitee.com/yangxioahui/demo_mybatis.git 一:tomcat的主要架构:1.如果我们下 ...
- Spring Boot第四弹,一文教你如何无感知切换日志框架?
持续原创输出,点击上方蓝字关注我吧 目录 前言 Spring Boot 版本 什么是日志门面? 如何做到无感知切换? 如何切换? 引入依赖 指定配置文件 日志如何配置? 总结 前言 首先要感谢一下读者 ...