一道非常好的数学题,不愧是CF的题,跟某些网站上的水题、恶心题没法比~

题意

这里就要夸一下某谷了,翻译的很好,不像我,在CF上用deepl翻译,不够清晰(←全是废话)

分析

先不考虑 bi ,考虑转换为将k1分配到每一个 bi 中(因为 bi ∈ N*),定义f(x,i) = ai x + x3 ,m = 1

则可以得出

Δf(x,i) = f(x + m,i) - f(x,i) = ai - 3x2 + 3x - 1

易得暴力:O(N)地去枚举每个1给哪个bi ,显然此时的 Δf(x,i) = ans = maxni = 1  Δf(x,i)

但是暴力的时间复杂度为O(NK),很明显,不行

再回归Δf(x,i) = f(x + m,i) - f(x,i) = ai - 3x2 + 3x - 1,x∈N* 

注意x∈N* 

在将Δf的函数图画出来之后,发现,只要存在x∈N* ,Δf单调递减,所以在暴力的做法中,每次增加的Δf(x,i) 一定也是递减

我们定义最大的 Δf(x,i) = p,也就是在暴力做法中第一次加的答案,之后的操作所增加的Δf(x,i)一定都不会超过p,由此,得出满足条件的最大的每一个bi ,可以看出,p具有单调性,想到了什么?二分!!!

所以直接二分p,可以求bi 的过程可以用二分,也可以用解一元二次方程的方法做

但是,这样使用二分,不一定使b序列之和 = k成立,所以剩下的一小部分,暴力求得最优解,同时计算Δf(x,i)

 1 #include"bits/stdc++.h"
2 using namespace std;
3 #define ll long long
4 const ll N = 200010,inf = 1e18;
5 #define inl inline
6 #define regi register int
7 ll n,k;
8 ll l,r,mid,sm;
9 ll a[N],v[N];
10 inl ll read(void)
11 {
12 ll x = 0,f = 1;char ch = getchar();
13 while(!isdigit(ch)) f = ch == '-' ? - 1 : f,ch = getchar();
14 while(isdigit(ch)) x = (x << 3) + (x << 1) + ch - '0',ch = getchar();
15 return x * f;
16 }
17 inl ll f(ll u,ll x);
18 inl ll calc(ll x,ll lim);
19 inl ll check(ll mid);
20 int main(void)
21 {
22 n = read(),k = read();
23 for(regi i = 1;i <= n;i ++)
24 {
25 a[i] = read(),l = min(l,f(a[i],a[i] - 1)),r = max(r,f(a[i],0));
26 }
27 while(r - l >= 2)
28 {
29 mid = (l + r) >> 1;
30 check(mid) ? r = mid : l = mid;
31 }
32 if(check(l))
33 {
34 r = l;
35 }
36 check(r);
37 k -= sm;
38
39 for(regi i = 1;i <= n;i ++)
40
41 if(k && v[i] < a[i] && f(a[i],v[i]) == r) v[i] ++,k --;
42
43 for(regi i = 1;i <= n;i ++)
44 {
45 printf("%lld ",v[i]);
46 }
47 return 0;
48 }
49
50 inl ll f(ll u,ll x)
51 {
52 return u == x ? inf : u - 3 * x * x + 3 * x - 1;
53 }
54 inl ll calc(ll x,ll lim)
55 {
56 ll l = 1,r = a[x],mid,res = a[x];
57 while(l <= r)
58 {
59 mid = (l + r) >> 1;
60 if(f(a[x],mid) <= lim)
61
62 r = mid - 1,res = mid;
63 else
64 l = mid + 1;
65 }
66 return res;
67 }
68 inl ll check(ll mid)
69 {
70 sm = 0;
71 for(regi i=1;i <= n;i ++)
72 {
73 sm += (v[i] = calc(i,mid));
74 }
75 return sm < k;
76 }

Résumé Review 二分方法题解的更多相关文章

  1. POJ 2785 4 Values whose Sum is 0 (二分)题解

    思路: 如果用朴素的方法算O(n^4)超时,这里用折半二分.把数组分成两块,分别计算前后两个的和,然后枚举第一个再二分查找第二个中是否有满足和为0的数. 注意和有重复 #include<iost ...

  2. CodeForces 1344D Résumé Review

    题意 给定一个长度为 \(n\) 的序列 \(a\) 和一个整数 \(k\),构造一个序列 \(b\) 使得满足以下条件: \(0\leq b_i\leq a_i\) \(\sum\limits_{i ...

  3. POJ 1743 Musical Theme(后缀数组 + 二分)题解

    题意:一行数字,定义如下情况为好串: 1.连续一串数字,长度大于等于5 2.这行数字中多次出现这串数字的相似串,相似串为该串所有数字同加同减一个数字,如 1 2 3 和 5 6 7 3.至少有一个相似 ...

  4. Trailing Zeroes (III) (二分)题解

    You task is to find minimal natural number N, so that N! contains exactly Q zeroes on the trail in d ...

  5. UVA 12338 Anti-Rhyme Pairs(hash + 二分)题解

    题意:给出两个字符串的最大相同前缀. 思路:hash是要hash,不hash是不可能的.hash完之后从头遍历判断超时然后陷入沉默,然后告诉我这能二分orz,二分完就过了,写二分条件写了半天.不要用数 ...

  6. SPOJ PHRASES Relevant Phrases of Annihilation(后缀数组 + 二分)题解

    题意: 给\(n\)个串,要你求出一个最长子串\(A\),\(A\)在每个字串至少都出现\(2\)次且不覆盖,问\(A\)最长长度是多少 思路: 后缀数组处理完之后,二分这个长度,可以\(O(n)\) ...

  7. Gym 101170F Free Weights(二分)题解

    题意:给出两行,每一行都有n个数组,一共有2 * n个,大小为1~n,每个有两个.现在可以进行操作:拿出一个物品i,然后放到一个空格,花费i.可以任意平移物品,平移没有花费.每一行空间无限.要求你把一 ...

  8. UVALive 7501 Business Cycle(二分)题解

    题意:n个数,有一个起始值,按顺序从第一个开始不断循环取数,如果取完后相加小于0就变为0,最多取p个数,问你得到大于等于值g所需要的最小起始值为多少 思路:这题目爆long long爆的毫无准备,到处 ...

  9. CF R 639 div2 F Review 贪心 二分

    LINK:Résumé Review 这道题让我眼前一亮没想到二分这么绝. 由于每个\(b_i\)都是局部的 全局只有一个限制\(\sum_{i=1}^nb_i=k\) 所以dp没有什么用 我们只需要 ...

  10. Codeforces Round #377 (Div. 2) D. Exams(二分答案)

    D. Exams Problem Description: Vasiliy has an exam period which will continue for n days. He has to p ...

随机推荐

  1. nrm 安装报错 解决方案

    想用 npm login 发现用的淘宝镜像,一看安装个nrm,结果运行还报错了.你看看. 改下,登录完再改回来. https://blog.csdn.net/mynewdays/article/det ...

  2. stm32读写sd卡代码解析和调试总结

    一 前言   做程序员真是来不得半点偷懒,假如你对经常使用的代码不熟悉,早晚会让你付出沉重的代价.像认识自己的灵魂一样认识每行用到的代码,这才是一个合格的程序员,才不至于在出现问题的时候出现慌乱.   ...

  3. 对TCP/IP协议的理解

    话说两台电脑要通讯就必须遵守共同的规则,就好比两个人要沟通就必须使用共同的语言一样.一个只懂英语的人,和一个只懂中文的人由于没有共同的语言(规则)就没办法沟通.两台电脑之间进行通讯所共同遵守的规则,就 ...

  4. 使用现代身份验证(OAuth)调用 EWS 服务

    我的博客园:https://www.cnblogs.com/CQman/ 转载: https://mp.weixin.qq.com/s?__biz=MzU0MzUxMzU2NA==&mid=2 ...

  5. 记录--Echarts绘制气泡图

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 Echarts绘制气泡图 气泡图是一种用于可视化三维数据的图表类型,其中两个变量用于确定数据点在平面上的位置,另一个变量用于确定气泡的大小 ...

  6. 记录--整会promise这8个高级用法

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 发现很多人还只会promise常规用法 在js项目中,promise的使用应该是必不可少的,但我发现在同事和面试者中,很多中级或以上的前端 ...

  7. KafkaConsumerDemo

    pom <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>sp ...

  8. 使用MFT进行加密文件传输的7个好处

    至少,托管文件传输(MFT)解决方案是一种产品,它包含入站和出站文件传输的所有方面,同时使用行业标准的网络协议和无缝加密.它可以从单个集中管理点在您的网络,系统,应用程序,贸易伙伴和云环境中自动化和传 ...

  9. Java程序连接KingbaseES 异常

    错误信息: --KStudio客户端工具错误信息 The conncetion attempt failed.Reason:connect time out --Java应用程序控制台日志 Cause ...

  10. Scala 特质自身类型

    1 package chapter06 2 3 object Test16_TraitSelfType { 4 def main(args: Array[String]): Unit = { 5 va ...