[7.18NOIP模拟测试5]砍树 题解(数论分块)
又考没学的姿势……不带这么玩的……
考场上打了个模拟 骗到30分滚粗了
稍加思考(滑稽)可将题面转化为:
求一个最大的$d$,使得
$\sum \limits _{i=1}^n {(\left \lceil \frac{a_i}{d} \right \rceil *d-a_i)} \leq k$
移项可得
$\sum \limits _{i=1}^n {\left \lceil \frac{a_i}{d} \right \rceil *d} \leq k+\sum \limits _{i=1}^{n}{a_i}$
那么$\leq$ 右侧就变成了一个常量,我们将其设为$C$。
把$d$除过去,得到
$\sum_\limits{i=1}^{n}\lceil\frac{a_i}{d}\rceil \leq \lfloor\frac{C}{d}\rfloor$
此时不等号左右都含有取整,都可以看作分段函数
我们现在想要最大的d,所以取每段的右端点一定比其它位置更优
之后求出等号左侧的$\lceil\frac{a_i}{d}\rceil$就可以通过判断更新答案
辣么怎么确定右端点呢?
这时候就需要一个东西:数论分块 (戳这里%大佬blog)
那么利用数论分块的结论:
对于形如$\sum_{i=1}^{n}{\lfloor \frac{n}{i} \rfloor}$的式子,
如果一段的左端点为$l$,那么右端点为$\lfloor \frac{n}{\lfloor \frac{n}{l}\rfloor} \rfloor$
本题得以在$O(n \sqrt{a_i})$的优秀复杂度内解决。
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=;
int n;
ll lim,a[N],sum,ans;
int main()
{
scanf("%d%lld",&n,&lim);
sum=lim;
for(int i=;i<=n;i++)
scanf("%lld",&a[i]),sum+=a[i];
ll d=;
while(sum/(d+)>)
{
d=sum/(sum/(d+));
ll res=;
for(int i=;i<=n;i++)
{
ll tmp=a[i]/d;
if(a[i]%d)tmp+=;
res+=tmp*d;
}
if(res<=sum)ans=d;
}
cout<<ans<<endl;
return ;
}
[7.18NOIP模拟测试5]砍树 题解(数论分块)的更多相关文章
- [07/18NOIP模拟测试5]超级树
鬼能想到的dp定义:dp[i][j]表示在一棵i级超级树中,有j条路径同时存在且这j条路径没有公共点时,可能的情况数 刚开始我也没看懂,所以举个例子 如一个2级的超级树,父节点为1,左右儿子为2,3 ...
- noip模拟8[星际旅行·砍树·超级树·求和]
也不能算考得好,虽然这次A了一道题,但主要是那道题太简单了,没啥成就感,而且有好多人都A掉了 除了那一道,其他的加起来一共拿了25pts,这我能咋办,无奈的去改题 整场考试的状态并不是很好啊,不知道是 ...
- 6.17考试总结(NOIP模拟8)[星际旅行·砍树·超级树·求和]
6.17考试总结(NOIP模拟8) 背景 考得不咋样,有一个非常遗憾的地方:最后一题少取膜了,\(100pts->40pts\),改了这么多年的错还是头一回看见以下的情景... T1星际旅行 前 ...
- 7. 18 test 砍树题解
(题面保密,内部人员可览) 首先观察题面,可得出如下公式 ∑(ceil(a[i] /d)*d−a[i])≤k 其中,ceil(a[i] /d)表示在需要被砍伐之前所经过的轮数,ceil函数是为了保证一 ...
- [7.18NOIP模拟测试5]星际旅行 题解
题面(加密) 考场上靠打表yy出的规律进而想到的正解233333 可以把一条双向边拆成两条单向边,这样的话每个点度数都为偶数,符合欧拉图的定义. 那么题目可以转化为:去掉两条边,使图中存在一条欧拉路. ...
- [CSP-S模拟测试]:Walk(树的直径+数学)
题目描述 给定一棵$n$个节点的树,每条边的长度为$1$,同时有一个权值$w$.定义一条路径的权值为路径上所有边的权值的最大公约数.现在对于任意$i\in [1,n]$,求树上所有长度为$i$的简单路 ...
- [CSP-S模拟测试]:柱状图(树状数组+二分+三分)
题目描述 $WTH$获得了一个柱状图,这个柱状图一共有$N$个柱子,最开始第$i$根柱子的高度为$x_i$,他现在要将这个柱状图排成一个屋顶的形状,屋顶的定义如下:$1.$屋顶存在一个最高的柱子,假设 ...
- [CSP-S模拟测试]:count(树分块)
题目描述 李华终于逃离了无尽的英语作文,重获自由的他对一棵树产生了兴趣.首先,他想知道一棵树是否能分成大小相同的几块(即切掉一些边,使得每个连通块的点数相同).然后,他觉得这个问题过于简单,于是他想知 ...
- [CSP-S模拟测试]:影魔(树状数组+线段树合并)
题目背景 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄.每一个灵魂,都有着自己 ...
随机推荐
- 【LeetCode 33】搜索旋转排序数组
题目链接 [题解] 会发现旋转之后,假设旋转点是i 则0..i-1是递增有序的.然后i..len-1也是递增有序的. 且nums[i..len-1]<nums[0]. 而nums[1..i-1] ...
- %d format: a number is required, not str。
python代码: attr_sql = "INSERT INTO `ym_attribute` (`attr_name`, `type_id`, `attr_value`, `attr_s ...
- MySql中4种批量更新的方法update table2,table1,批量更新用insert into ...on duplicate key update, 慎用replace into.
mysql 批量更新记录 MySql中4种批量更新的方法最近在完成MySql项目集成的情况下,需要增加批量更新的功能,根据网上的资料整理了一下,很好用,都测试过,可以直接使用. mysql 批量更新共 ...
- dotnet core项目的nuget存储路径
Where's the package location in aspnet core For project.json the nuget directory is in the user prof ...
- MySQL concat、concat_ws 和 group_concat 的用法
一.CONCAT()函数CONCAT()函数用于将多个字符串连接成一个字符串.使用数据表Info作为示例,其中SELECT id,name FROM info LIMIT 1;的返回结果为+----+ ...
- python requests方法post请求json格式处理
方法如下: import requestsimport json data = { 'a': 123, 'b': 456} ## headers中添加上content-type这个参数,指 ...
- haproxy附加
1.安装haproxy yum -y install haproxy 2.编写文件 vim /etc/haproxy/haproxy.cfg
- SqlServer 跨库访问
同实例跨库 只需要 库名.dbo.表 dbo可省略 如: use Test select * from rdrecords select * from oa.dbo.UserInfo 不同实例与不同i ...
- 线性方程组迭代算法——Gauss-Seidel迭代算法的python实现
原理: 请看本人博客:线性方程组的迭代求解算法——原理 代码: import numpy as np max=100#迭代次数上限 Delta=0.01 m=2#阶数:矩阵为2阶 n=3#维数:3X3 ...
- 迭代器,生成器,yield,yield from理解
迭代器 说到迭代器就得想说可迭代对象Iterable,实现了__iter__()方法的对象都是可迭代对象,例如很多容器,list ,set, tuples.使用iter方法可以把一个可迭代对象变成迭代 ...