CF1413C Perform Easily 题解
毒瘤C题,考场卡我1个小时
首先,这道题难点在哪里?它的最大值与最小值都是浮动的。
怎么办?把最小/最大值固定!
以把最小值固定为例,我们枚举每个音符,并枚举它使用哪条琴弦,将它此时的位置强制其作为最小值(设为\(minx\))。
同时,我们令其他音符不作为最小值,即其他的音符的位置不能小于最小值。
接下来,我们只需计算每个音符的最小位置(但不小于最小值),在这些音符中取 \(\max\) 即可。
直接的想法是枚举其他的所有音符,寻找满足 \(b_i-a_j \ge minx\) 最大 \(a_j\) (此时 \(b_i-a_j\) 最小)。
很明显,这样做是 \(O(n)\) 的。然而,我们要枚举 \(6n\) 个最小值,时间复杂度为\(O(n^2)\) (把常数项省掉了)…
略加思考,我们发现并不是所有的音符都要枚举一遍。我们把\(a、b\)数组分别从小到大排序,并把\(a\)数组去重(原因后面讲),那么最悲惨的音符(雾) 肯定是那些可以用 \(a_{j-1}\) 的琴弦,但正好用不了 \(a_j\) 的琴弦的音符中最大的一个。当然,如果存在音符连 \(a_1\) 都用不了,直接判定当前最小值不合法,并枚举下一个最小值。
举个例子:\(a\)数组为 \([1,3,5]\) (去重以后),\(b\)数组为 \([4,5,6,6,7]\),\(minx\)为\(3\)。
那么,\(5、7\)是最悲惨的音符,因为\(5\)是可以用琴弦\(a_1\)但用不了琴弦\(a_2\)(有\(4、5\)两个音符)中最大的音符,\(7\)是可以用琴弦\(a_2\)但用不了琴弦\(a_3\)中最大的音符。显然,最大的位置将在最悲惨的音符中产生。
由于我们对 \(b\) 数组排过序,因此对每一条琴弦,直接二分查找最大的 \(b_i\) ,使 \(b_i-a_j < minx\) 即可。
于是,我们只要找到这些音符即可。这些音符最多不超过\(6\)个。时间复杂度 \(O(n \log n)\) 。
最后说一句,为什么\(a\)要去重?因为我们要找可以用 \(a_{j-1}\) 的琴弦但用不了 \(a_j\) 的琴弦的音符,如果存在重复,即 \(a_{j-1}=a_j\) ,则可能这个音符 \(a_{j-1}\) 的琴弦、 \(a_j\) 的琴弦都用不了,明显不符。
\(Code:\)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
ll a[10],n,b[100010],pos[10],cnt;
ll ans=1e18;
int main(){
for(int i=1;i<=6;i++) scanf("%lld",&a[i]);
sort(a+1,a+7);cnt=unique(a+1,a+7)-a-1;//去重
cin>>n;
for(int j=1;j<=n;j++) scanf("%lld",&b[j]);
sort(b+1,b+n+1);
for(int i=1;i<=n;i++){
for(int j=1;j<=cnt;j++){
ll minx=b[i]-a[j],maxn=0,last=0; //枚举minx
if(b[1]-a[1]<minx) goto fail;
for(int k=2;k<=cnt;k++){
last=lower_bound(b+last+1,b+n+1,minx+a[k])-b-1;//二分查找
maxn=max(maxn,b[last]-a[k-1]);//更新最大位置
}
for(int k=cnt;k>=1;k--){
if(b[n]-a[k]>=minx){
maxn=max(maxn,b[n]-a[k]); //最大的音符特殊处理一下
break;
}
}
ans=min(ans,maxn-minx);//更新答案
fail:;
}
}
cout<<ans<<endl;
return 0;
}
CF1413C Perform Easily 题解的更多相关文章
- Codeforces Round #679 (Div. 2, based on Technocup 2021 Elimination Round 1)
考场上只做出来四道,第二天一早就写出来了E,蛮绝望的. A Finding Sasuke 水构造 #include <cstdio> #include <algorithm> ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- 《ACM国际大学生程序设计竞赛题解Ⅰ》——基础编程题
这个专栏开始介绍一些<ACM国际大学生程序设计竞赛题解>上的竞赛题目,读者可以配合zju/poj/uva的在线测评系统提交代码(今天zoj貌似崩了). 其实看书名也能看出来这本书的思路,就 ...
- usaco training 4.2.3 Job Processing 题解
Job Processing题解 IOI'96 A factory is running a production line that requires two operations to be pe ...
- 题解——CodeForces 438D The Child and Sequence
题面 D. The Child and Sequence time limit per test 4 seconds memory limit per test 256 megabytes input ...
- leetcode & lintcode 题解
刷题备忘录,for bug-free 招行面试题--求无序数组最长连续序列的长度,这里连续指的是值连续--间隔为1,并不是数值的位置连续 问题: 给出一个未排序的整数数组,找出最长的连续元素序列的长度 ...
- Codeforces Round #468 Div. 2题解
A. Friends Meeting time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- 题解【Codeforces438D】The Child and Sequence
题目描述 At the children's day, the child came to Picks's house, and messed his house up. Picks was angr ...
- Not Adding - 题解【数学,枚举】
题面 原题链接(CF1627D) You have an array \(a_1,a_2,-,a_n\) consisting of \(n\) distinct integers. You are ...
随机推荐
- SpringBoot-05-web开发
5. SpringBoot Web开发 5.1 web开发探究 简介 SpringBoot最大的特点就是自动装配! 使用SpringBoot的步骤: 创建一个SpringBoot应用,选择我们需要的模 ...
- 排序算法:归并排序(Merge Sort)
归并排序 归并排序采用了分治策略(divide-and-conquer),就是将原问题分解为一些规模较小的相似子问题,然后递归解决这些子问题,最后合并其结果作为原问题的解. 归并排序将排序数组A[1. ...
- CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths 树上启发式合并(DSU ON TREE)
题目描述 一棵根为\(1\) 的树,每条边上有一个字符(\(a-v\)共\(22\)种). 一条简单路径被称为\(Dokhtar-kosh\)当且仅当路径上的字符经过重新排序后可以变成一个回文串. 求 ...
- 深入研究RocketMQ消费者是如何获取消息的
前言 小伙伴们,国庆都过的开心吗?国庆后的第一个工作日是不是很多小伙伴还沉浸在假期的心情中,没有工作状态呢? 那王子今天和大家聊一聊RocketMQ的消费者是如何获取消息的,通过学习知识来找回状态吧. ...
- Java虚拟机诊断利器
Java虚拟机诊断利器
- (转载)跟Classic ARM 处理器说拜拜——Atmel SAMA5D3 Xplained开发板评测
2014 年 4 月 10 日 时间: 下午 3:15 作者: 幸得安然 电子产业的蓬勃发展带来了史无前例的生活.生产大跃进,但是,人们在享受发展喜悦的同时又不得不面临现实现状的囧境--在以移动电子设 ...
- eclipse 配置opencv
1 准备 eclipse 2017 JDK1.8 opencv 4.40 2 配置 新建java工程 添加jar包 选择opencv-xxx.jar包 加入原生库 选择原生库位置 确认即可,测试 新建 ...
- selenium环境配置学习笔记
一 为什么进行自动化测试 缩短测试周期 避免人为出错 测试信息存储 轻易获取覆盖率 二 web/ui自动化条件和适用范围 手工测试已经完成,后期在不影响进度的前提下逐渐实现自动化 项目周期长,重复性工 ...
- Windows Server 设置自动登陆
前言 Windows Server 相信很多人都在使用,但是系统每次登陆都比较麻烦,能否设置自动登陆呢?有兴趣一起来学习一下吧!的自动登陆方法也比较多,在此分享一个实用简单的,通过命令来设置" ...
- 洛谷 P6419 Kamp 题解
明天就SX AFO了交篇题解%一下 这题大概是我第一道有独立思考切掉的紫题 之前的都是各种抄借鉴题解 为什么写这题的题解呢?另一个重要的原因是这样的↓ 翻了翻已有题解中的几篇,下面几种情况屡见不鲜 样 ...