【CodeForces 830C】奇怪的降复杂度
[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=60638239
description
有n棵竹子,初始时每棵竹子高度都是0,每棵竹子每天长高1m
对于每棵竹子,我们不希望其高度超过a[i],如果超过了,我们就会把超过的部分减去
奇怪的是减去之后竹子就不会再长了
我们不希望每天去看一下竹子的情况,希望每隔d天去看一下竹子的情况
本着爱护环境的原则,我们不希望减去的竹子长度之和大于K
我们最多可以隔多少天去看一次竹子?
input
第一行两个整数n,K
第二行n隔整数表示a[i]
output
一个整数表示答案,即最大的d值
hint
20%:ai<=5*10^5
另有20%:k<=1
100%:1<=n<=100,0<=k<=10^11,1<=ai<=10^9
这道题我还愣是问大佬问了好久才搞懂。
第一眼:而不是二分嘛,水!结果考试快结束是才反应过来这答案并不满足二分的性质。如:4 4 4,d选4比选3优。
那么怎么办呢?
首先可以明确,d一定小于a[i]的最大值。那么这个d就太多了啊。如果直接暴力去for d,肯定是不行的,只能得20分。我们希望可以减少一些无用的d的枚举。
先可以得到公式:
转化一下:
我们可以发现,对于[ai/d]向上取整,有多个d对应相同的值。如:10/d,d=5,6,7,8,9都对应一个值2,可以证明d的数量是o(√n)
我们记录每一个ai对应的d,其中d可以代表一系列d。在算出了sigma([ai/d])后,可以根据上面的公式求出最大的d
暴力枚举得出的d,复杂度o(n*ai^0.5)
详情看代码吧。。。解释起来好麻烦。。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=105;
const int M=100000+5;
ll a[N],n,k,c=0;
ll ans=0,tot=0,vec[N*M],cnt=0;
int main(){
scanf("%lld%lld",&n,&k);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
c+=a[i];
for(int j=1;j*j<=a[i];j++)
vec[++cnt]=j,vec[++cnt]=(a[i]-1)/j+1;
}
c+=k;
sort(vec+1,vec+cnt+1);
cnt=unique(vec+1,vec+cnt+1)-(vec+1);
for(int i=1;i<=cnt;i++){
ll d=vec[i];
tot=0;
for(int j=1;j<=n;j++)
tot+=(a[j]-1)/d+1;
if(c/tot<d) continue;
ans=max(ans,c/tot);
}
printf("%lld",ans);
return 0;
}
总结:
1、在想二分时可以举例子来验证答案的单调性
2、把公式写出来时,可以结合一些数论的知识,看看能不能化简
【CodeForces 830C】奇怪的降复杂度的更多相关文章
- 暴力+降复杂度 BestCoder Round #39 1002 Mutiple
题目传送门 /* 设一个b[]来保存每一个a[]的质因数的id,从后往前每一次更新质因数的id, 若没有,默认加0,nlogn复杂度: 我用暴力竟然水过去了:) */ #include <cst ...
- Mr. Kitayuta's Colorful Graph CodeForces - 506D(均摊复杂度)
Mr. Kitayuta has just bought an undirected graph with n vertices and m edges. The vertices of the gr ...
- Codeforces 830C On the Bench
题意:给你n个数,问有多少种排列方式使得任意两个相邻的数的乘积都不是完全平方数 我好弱,被组合和数论吊着打... 首先我们可以把每个数中固有的完全平方数给分离出来,那么答案其实就只与处理后的序列相关. ...
- Codeforces 830C Bamboo Partition 其他
原文链接https://www.cnblogs.com/zhouzhendong/p/CF830C.html 题解 把问题转化成求最大的 $d$ ,满足$$\sum_{1\leq i \leq n}( ...
- Codeforces 830C Bamboo Partition (看题解)
Bamboo Partition 列公式, 整除分块, 想不到, 好菜啊. #include<bits/stdc++.h> #define LL long long #define fi ...
- words2
餐具:coffee pot 咖啡壶coffee cup 咖啡杯paper towel 纸巾napkin 餐巾table cloth 桌布tea -pot 茶壶tea set 茶具tea tray 茶盘 ...
- 嵌入式开发—C语言面试题
嵌入式开发—C语言面试题 源地址:http://blog.csdn.net/xdx2ct1314/article/details/7358929 1. 用预处理指令#define 声明一个常数,用 ...
- 匹夫细说C#:委托的简化语法,聊聊匿名方法和闭包
0x00 前言 通过上一篇博客<匹夫细说C#:庖丁解牛聊委托,那些编译器藏的和U3D给的>的内容,我们实现了使用委托来构建我们自己的消息系统的过程.但是在日常的开发中,仍然有很多开发者因为 ...
- bzoj 2058+2059+2060 Usaco2010 Nov
三道金组比较容易的题目.. 2058 首先交换次数就是逆序对数,因为只能交换相邻的两数 先对原序列找逆序对数 用树状数组nlogn求出 然后O(n)依次求出其循环序列的逆序对数 比如 3 5 4 2 ...
随机推荐
- 1.0 python-client以及ui自动化介绍
appium的client-----捕获元素和对元素进行操作都是在client里面去写脚本实现的,client会将你写的python脚本发送到appium server上,然后appium serv ...
- 防御暴力破解SSH攻击
托管在IDC的机器我们通常都用SSH方式来远程管理.但是经常可以发现log-watch的日志中有大量试探登录的 信息,为了我们的主机安全,有必要想个方法来阻挡这些可恨的"HACKER&quo ...
- CPU封装技术介绍
所谓“CPU封装技术”是一种将集成电路用绝缘的塑料或陶瓷材料打包的技术.以CPU为例,我们实际看到的体积和外观并不是真正的CPU内核的大小和面貌,而是CPU内核等元件经过封装后的产品. CPU封装对于 ...
- vmware中linux虚拟机使用NAT模式不能连接外网解决
linux虚拟机一直配置的桥接模式,今天改成NAT模式发现不能上外网 环境:VMware12,CentOS 6.8,NAT模式 ①电脑实际ip:192.168.1.100 ②NAT使用虚拟网卡网关: ...
- [洛谷P2216][HAOI2007]理想的正方形
题目大意:有一个$a\times b$的矩阵,求一个$n\times n$的矩阵,使该区域中的极差最小. 题解:二维$ST$表,每一个点试一下是不是左上角就行了 卡点:1.用了一份考试时候写的二维$S ...
- [BZOJ3196] 二逼平衡树 [权值线段树套位置平衡树]
题面 洛咕题面 思路 没错我就是要不走寻常路! 看看那些外层位置数据结构,必须二分的,$O(n\log^3 n)$的做法吧! 看看那些cdq分治/树状数组套线段树的,空间$O(n\log^2 n)$挤 ...
- [bzoj4712] 洪水 [树链剖分+线段树+dp]
题面 传送门 思路 DP方程 首先,这题如果没有修改操作就是sb题,dp方程如下 $dp[u]=max(v[u],max(dp[v]))$,其中$v$是$u$的儿子 我们令$g[u]=max(dp[v ...
- altera ip 核小究
用quartus的MegaWizard工具生成一个乘法器multiplier,会在工程目录下产生 multiplier.qip (可选) multiplier_bb.v (可选) multip ...
- Tomcat的context.xml说明、Context标签讲解
Tomcat的context.xml说明.Context标签讲解 1. 在tomcat 5.5之前 --------------------------- Context体现在/conf/server ...
- js判断变量类型,类型转换,
1.typeof 操作符 主要检测基础数据类型 var a="zhangqian"; var b=true; ; var d; var e=null; var f=new Obje ...