一道非常好的数学题,不愧是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. Idea编译/运行Java程序慢

    修改前: 修改后: 参考: https://www.jjput.com/archives/macbookpro14m1mavenslowcompilation 问题 JDK尽量不要换版本 class ...

  2. linux 系统目录详解

    tmpfs 的优势: 1,动态文件系统的大小. 2,tmpfs 的另一个主要的好处是它闪电般的速度.因为典型的 tmpfs 文件系统会完全驻留在 RAM 中,读写几乎可以是瞬间的. 3,tmpfs 数 ...

  3. TCP可靠传输的保证

    我们知道传输层提供最主要的两种协议,TCP和UDP,其中TCP是保证可靠传输,为什么他要保证可靠传输呢,IP说:当然是我不能,我只提供尽力而为的服务,不保证你能不能交付,不保证能不能正确的交付,不保证 ...

  4. 【C语言复习笔记】一些要点

    [C语言复习笔记]一些要点 按学校教材复习的,整理的是我不熟悉的地方 最近C用的好少,快忘完了就赶紧整理一下(Python真好玩) 第一章 初识C语言 存储器 内存容量的大小,取决于地址总线的数量 \ ...

  5. 低代码平台前端的设计与实现(二)构建引擎BuildEngine切面处理设计

    上一篇文章,我们介绍了如何设计并实现一个轻量级的根据JSON的渲染引擎,通过快速配置一份规范的JSON文本内容,就可以利用该JSON生成一个基础的UI界面.本文我们将回到低开的核心-页面拖拉拽,探讨关 ...

  6. 5G+实时云渲染,让元宇宙应用触手可及

    从2021年初被称为"元宇宙第一股"的罗布乐思(Roblox)正式在纽交所上市,到2021年10月Facebook更名为"Meta"宣布进军元宇宙,再到如今各大 ...

  7. proteus的C51仿真

    Proteus的C51仿真 1.实验原理 Proteus是对C51仿真效果比较好的软件了,可以利用丰富的数字资源的外设实现比较接近实际的设计.仿真方法也比较简单,不需要下载,只需要将仿真文件导出到器件 ...

  8. KingbaseES V8R6 中syssql_tmp目录说明

    前言 不久前有前端人员咨询过一个问题,为什么syssql_tmp目录下会产生如此多的大文件. 针对这个目录的解释是:临时文件(用于排序超出内存容量的数据等操作)是在$KINGBASE_DATA/bas ...

  9. KingabseES例程-函数和过程的 INVOKER 与 DEFINER

    调用者权利和定义者权利子句 指定子程序的权利属性.权利属性影响单元在运行时,执行的SQL语句的名称解析和权限检查. PG模式: SECURITY INVOKER SECURITY DEFINER Or ...

  10. [apue] 书中关于打印服务代码的一个错误

    在看 apue 第 21 章 与网络打印机通信一章时,发现一段关于链表操作的代码有问题,现在摘出来让大家 review 一下.先上代码: printd.c 这是打印服务的源代码,在打印时,用户通过  ...