HZOI2019 砍树 整除分块
题目链接:https://www.cnblogs.com/Juve/articles/11207540.html(密码你懂的)——————————>>
这题。。。
一开始想的二分,但此题不具备决策单调性,所以是错的
看了题解之后并不知道它在考什么
看一眼官方提解:
问题等价于求一个最大的d,满足$\sum_\limits{i=1}^{n}(\lceil\frac{a_i}{d}\rceil*d-a_i)<=k$
移项整理,令C=$k+\sum_\limits{i=1}^{n}a_i$,则:
$\sum_\limits{i=1}^{n}\lceil\frac{a_i}{d}\rceil*d<=C$
到这里思路还是非常清晰的,但后面稍微玄学。
我们注意到对于每一个ai,$\lceil\frac{a_i}{d}\rceil$只有$a_{i}^{0.5}$种不同的取值,因此$\sum_\limits{i=1}^{n}\lceil\frac{a_i}{d}\rceil$只有n*$a_{i}^{0.5}$种不同的取值,在它的值确定之后,只需要简单的除法就可以求出d的最大值。因此把所有的不同的d的取值预处理出来排序,然后暴力计算,检验求出的d是否在这个取值所要求的d的范围内,并更新答案即可。
如何求d最大值?
对于上面的式子,我们把d除过去,可得:
$\sum_\limits{i=1}^{n}\lceil\frac{a_i}{d}\rceil<=\lfloor\frac{C}{d}\rfloor$
其中$\lceil\frac{a_i}{d}\rceil$和$\lfloor\frac{C}{d}\rfloor$都是单调不上升的。具体来说都是分段的,那么对于$\lfloor\frac{C}{d}\rfloor$的同一段上,段尾的d值一定优于段首值。
那么枚举每一个段尾的d值,暴力求$\lceil\frac{a_i}{d}\rceil$,更新答案即可。这样便可以知道当前d的最大可行取值。
那么如何去找函数的每一段呢?我们设函数左端点为p,右端点为q, q=$\large \left \lfloor \frac {sum}{\left \lfloor \frac {sum}{p} \right \rfloor } \right \rfloor$,很神奇,但貌似不太好证,总之是对的。其实证明的话,来波链接:https://www.cnblogs.com/0xfffe/p/9648943.html
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#define MAXN 105
#define ll long long
using namespace std;
ll n,k,a[MAXN],sum=0,d=0,ans=0;
int main(){
scanf("%lld%lld",&n,&k);
for(ll i=1;i<=n;i++){
scanf("%lld",&a[i]);
sum+=a[i];
}
sum+=k;
while(1){
if(sum/(d+1)<=0) break;
d=sum/(sum/(d+1));
ll res=0;
for(ll i=1;i<=n;i++){
ll t;
if(a[i]%d) t=(a[i]/d)+1;
else t=a[i]/d;
res+=t*d;
}
if(res<=sum) ans=d;
}
printf("%lld\n",ans);
return 0;
}
HZOI2019 砍树 整除分块的更多相关文章
- 6.17考试总结(NOIP模拟8)[星际旅行·砍树·超级树·求和]
6.17考试总结(NOIP模拟8) 背景 考得不咋样,有一个非常遗憾的地方:最后一题少取膜了,\(100pts->40pts\),改了这么多年的错还是头一回看见以下的情景... T1星际旅行 前 ...
- [CSP-S模拟测试]:砍树(数学+模拟)
题目传送门(内部题1) 输入格式 第一行两个整数$n$,$k$,代表树苗的数量和最大看书的总长度.第二行n个整数$a_i$,代表林先森希望每棵树苗的最终高度. 输出格式 一行一个整数,代表最大可能的d ...
- noip模拟8[星际旅行·砍树·超级树·求和]
也不能算考得好,虽然这次A了一道题,但主要是那道题太简单了,没啥成就感,而且有好多人都A掉了 除了那一道,其他的加起来一共拿了25pts,这我能咋办,无奈的去改题 整场考试的状态并不是很好啊,不知道是 ...
- NOIP模拟测试5「星际旅行·砍树·超级树」
星际旅行 0分 瞬间爆炸. 考试的时候觉得这个题怎么这么难, 打个dp,可以被儿子贡献,可以被父亲贡献,还有自环,叶子节点连边可以贡献,非叶子也可以贡献,自环可以跑一回,自环可以跑两回, 关键是同一子 ...
- AC日记——砍树 codevs 1388
1388 砍树 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 伐木工人米尔科需要砍倒M米长的木 ...
- codevs 1388 砍树
时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题目描述 Description 伐木工人米尔科需要砍倒M米长的木材.这是一个对米尔科来说很容易的工作,因为他有一 ...
- BZOJ 1086 & 类树的分块
题意: “余”人国的国王想重新编制他的 国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理.他的国家有n个城市,编号为1..n.一些城市之间有道路相连,任意两个 不同的城市之间 ...
- {CSDN}{英雄会}{砍树、石子游戏}
砍树 思路: 可以将题目意图转化为:给定一棵树,求其中最接近总权值一半的子树. DFS求每个节点的所有子节点的权值和,遍历每个节点,最接近总权值一半的即为答案.复杂度O(N). 石子游戏: 思路: 一 ...
- 1369 xth 砍树
1369 xth 砍树 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 在一个凉爽的夏夜,xth 和 ...
随机推荐
- JSON 单例类
MD5JSON.h #pragma once #include "include/json/json.h" #include "include/md5/md5.h&quo ...
- (转)第05节:Fabric.js的动画设置
凡是出色的Canvas库都少不了制作动画的方法,Fabric.js也不例外,它有着编写简单且功能强大的动画助手,这就是animate( )方法. animate主要使用代码如下: rect.anima ...
- 创建自定义ssl证书用于https
这里,不探究证书原理.我们要完成的任务是,自己充当CA,然后签出证书供服务器使用. 本次教程是在windows实现,实验之前,确认自己的电脑中有openssl程序.如果没有,博主帮你准备了一个:htt ...
- MDK 虚拟串口 *** error 30: undefined name of virtual register
概念说明 查看已有的虚拟寄存器 输入指令: dir vtreg 可以看到没有要配置的虚拟寄存器SxIN和SxOUT,通过查询手册可以看到所有的虚拟寄存器类型: 说明不支持.
- P1736 创意吃鱼法 /// DP
题目大意: https://www.luogu.org/problemnew/show/P1736 题解 dplr[][] 当前点左边(副对角线时为右边)有多少个连续的0 dpup[][] 当前点上边 ...
- selenium基础(参数化脚本)
参数化脚本 什么是参数化 参数化就是用包含多组数据的参数列表,使之替换脚本中的响应常量值,这样,在脚本运行的时候,就会使用参数表中的数据来代替脚本中的常量值 由于参数表中包含了多组数据,所以执行用例时 ...
- java_日历类
calendar是日历类,该类是抽象类不能被实例化 public class CalendarTest { /* 创建对象和方法的使用 */ public static void main(Strin ...
- Java多线程设计模式系列
通过几天的认真阅读,发现这是一本难得一见的好书,为了加深巩固学习成功,我打算将书中的例子全部自己实现一遍,特此记录下来也方便其他朋友学习. 第一章,java语言的线程 单线程程序:打印10000次go ...
- Spring父子上下文(WebApplicationContext)(防止事务失效)
如果你使用了listener监听器来加载配置,一般在Struts+Spring+Hibernate的项目中都是使用listener监听器的.如下 <listener> <listen ...
- LINUX挂接Windows文件共享
Windows网络共享的核心是SMB/CIFS,在linux下要挂接(mount)windows的磁盘共享,就必须安装和使用samba 软件包.现在流行的linux发行版绝大多数已经包含了samba软 ...