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 和 ...
随机推荐
- duilib教程之duilib入门简明教程15.自绘控件
在[2013 duilib入门简明教程 -- 复杂控件介绍 (13)]中虽然介绍了界面设计器上的所有控件,但是还有一些控件并没有被放到界面设计器上,还有一些常用控件duilib并没有提供(比如菜单控件 ...
- js--判断当前环境是否为app环境
/** *判断是否是app环境 */ function getIsApp () { var ua = navigator.userAgent.toLowerCase(); if (ua.match(/ ...
- spring mvc多环境下配置文件的设置
在实际开发时经常需要把一些配置信息写在配置文件,比如mysql的主机地址.端口号.用户名和密码等.另外,在开发代码时可能用一套配置参数,而部署到测试环境时又会用另一套配置参数,测试完毕再部署到线上环境 ...
- C语言结构体初始化方法
早上苏凯童鞋问我这个问题来着,写在这里. 我了解到的C中结构体初始化的方法大概有三种. 如这里我定义了一个结构体: typedef struct node { int x, y; }Node; 第一种 ...
- arcmap分类标注问题
在给图层标注的时候,经常出现冲突后有些标注出不来,需要将某些个别的点要素进行标注位置调整,如下图: 处理步骤如下, (1)打开Maplex标注引擎.从ToolBars中打开Labeling工具,勾选U ...
- 缓冲(cache)和缓存(buffer)
缓存: 指把常用数据存储到可以快速获取的区域,以备重复利用 一般叫做cache. 缓存能提高效率 缓冲: 是指在数据流转过程中,不同层次速度不一致时,利用缓冲区来缓解上下层之间速率问题(性能差异) 一 ...
- day 66 Django基础二之URL路由系统
Django基础二之URL路由系统 本节目录 一 URL配置 二 正则表达式详解 三 分组命名匹配 四 命名URL(别名)和URL反向解析 五 命名空间模式 一 URL配置 Django 1.11 ...
- springboot整合shiro的使用
shiro的原理已经有博客了,自己写可以问度娘 参考https://www.cnblogs.com/liyinfeng/p/8033869.html 此处直接描述实际使用 一.pom.xml引包 &l ...
- poj2407(欧拉函数模板)
sqrt(n)复杂度 欧拉函数模板 #include <iostream> #include <cstdio> #include <queue> #include ...
- JWT生成token
1.JWT简介 JSON Web Token 简称JWT.一个JWT实际上就是一个字符串,它由三部分组成,头部.载荷与签名.JWT生成的token是这样的 2.Json Web Token(JWT)生 ...