【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 ...
随机推荐
- 孤荷凌寒自学python第十九天python函数嵌套与将函数作为返回对象及闭包与递归
孤荷凌寒自学python第十九天python函数嵌套与将函数作为返回对象及闭包与递归 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) Python函数非常的灵活,今天学习了python函数的以 ...
- ThreadLocal 学习
JDK 1.2版本就已经提供了java.lang.ThreadLocal.其为多线程程序的并发问题提供了一种新的思路.使用该工具类可以简洁地编写出优美的多线程程序. 当使用ThreadLocal维护变 ...
- ArcGIS 创建要素时提示“表已经被注册(table already registered)”
今天一位实施大哥在ArcCatalog中要重建一个要素类,所以就在ArcCatalog中连接上Oracle数据库,直接删除了要素类,然后重新创建了一个新的要素类,可是却报错“表已经被创建”,并提示不可 ...
- 湘潭邀请赛 2018 D Circular Coloring
题意: 给一个环,环上有n+m个点.给n个点染成B,m个点染成W.求所有染色情况的每段长度乘积之和. 题解: 染成B的段数和染成W的段数是一样的(因为是环). 第一段是可以移动的,例如BBWWW移动为 ...
- [NOWCODER] myh的超级多项式
题面 已知$f_i=(\sum_{j=1}^ka_j{v_j}^i )\bmod 1004535809$ 给定$v_1,v_2,\ldots,v_k,f_1,f_2,\ldots f_k$ 求$f_n ...
- 原来Java大数据才是真正的高富帅!
大数据时代,中国IT环境也将面临重新洗牌,不仅仅是企业,更是程序员们转型可遇而不可求的机遇. 国内大多数大型互联网公司的程序员被称作研发工程师,但实际上国内几乎没有研发项目,只能叫做开发.开发程序员的 ...
- 了解腾讯开源的多渠道打包技术 VasDolly源码解析
一.概要 大家应该都清楚,大家上线app,需要上线各种平台,比如:小米,华为,百度等等等等,我们多数称之为渠道,如果发的渠道多,可能有上百个渠道. 针对每个渠道,我们希望可以获取各个渠道的一些独立的统 ...
- [poj] 3347 Kadj Square || 计算几何的“线段覆盖”
原题 多组数据,给出n个正方形的边长,使他们以45度角倾斜的情况下最靠左(在第一象限内),如图.求从上看能看到哪几个完整的正方形. 借鉴于https://www.cnblogs.com/Ritchie ...
- POJ3252 Round Numbers 【数位dp】
题目链接 POJ3252 题解 为什么每次写出数位dp都如此兴奋? 因为数位dp太苟了 因为我太弱了 设\(f[i][0|1][cnt1][cnt0]\)表示到二进制第\(i\)位,之前是否达到上界, ...
- 一天一条linux命令 for zipon
linux学习网站:https://linuxtools-rst.readthedocs.io/zh_CN/latest/base/index.html 19.dhclient eth0 使网卡生效, ...