Résumé Review 二分方法题解
一道非常好的数学题,不愧是CF的题,跟某些网站上的水题、恶心题没法比~
题意
这里就要夸一下某谷了,翻译的很好,不像我,在CF上用deepl翻译,不够清晰(←全是废话)

分析
先不考虑 bi ,考虑转换为将k个1分配到每一个 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 二分方法题解的更多相关文章
- POJ 2785 4 Values whose Sum is 0 (二分)题解
思路: 如果用朴素的方法算O(n^4)超时,这里用折半二分.把数组分成两块,分别计算前后两个的和,然后枚举第一个再二分查找第二个中是否有满足和为0的数. 注意和有重复 #include<iost ...
- CodeForces 1344D Résumé Review
题意 给定一个长度为 \(n\) 的序列 \(a\) 和一个整数 \(k\),构造一个序列 \(b\) 使得满足以下条件: \(0\leq b_i\leq a_i\) \(\sum\limits_{i ...
- POJ 1743 Musical Theme(后缀数组 + 二分)题解
题意:一行数字,定义如下情况为好串: 1.连续一串数字,长度大于等于5 2.这行数字中多次出现这串数字的相似串,相似串为该串所有数字同加同减一个数字,如 1 2 3 和 5 6 7 3.至少有一个相似 ...
- Trailing Zeroes (III) (二分)题解
You task is to find minimal natural number N, so that N! contains exactly Q zeroes on the trail in d ...
- UVA 12338 Anti-Rhyme Pairs(hash + 二分)题解
题意:给出两个字符串的最大相同前缀. 思路:hash是要hash,不hash是不可能的.hash完之后从头遍历判断超时然后陷入沉默,然后告诉我这能二分orz,二分完就过了,写二分条件写了半天.不要用数 ...
- SPOJ PHRASES Relevant Phrases of Annihilation(后缀数组 + 二分)题解
题意: 给\(n\)个串,要你求出一个最长子串\(A\),\(A\)在每个字串至少都出现\(2\)次且不覆盖,问\(A\)最长长度是多少 思路: 后缀数组处理完之后,二分这个长度,可以\(O(n)\) ...
- Gym 101170F Free Weights(二分)题解
题意:给出两行,每一行都有n个数组,一共有2 * n个,大小为1~n,每个有两个.现在可以进行操作:拿出一个物品i,然后放到一个空格,花费i.可以任意平移物品,平移没有花费.每一行空间无限.要求你把一 ...
- UVALive 7501 Business Cycle(二分)题解
题意:n个数,有一个起始值,按顺序从第一个开始不断循环取数,如果取完后相加小于0就变为0,最多取p个数,问你得到大于等于值g所需要的最小起始值为多少 思路:这题目爆long long爆的毫无准备,到处 ...
- CF R 639 div2 F Review 贪心 二分
LINK:Résumé Review 这道题让我眼前一亮没想到二分这么绝. 由于每个\(b_i\)都是局部的 全局只有一个限制\(\sum_{i=1}^nb_i=k\) 所以dp没有什么用 我们只需要 ...
- 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 ...
随机推荐
- 摆脱鼠标系列 - vscode - ctrl+up 光标上移动4行 ctrl+down 光标下移4行
为什么 摆脱鼠标系列 - vscode - ctrl+up 光标上移动4行 之前滚动屏幕总是用鼠标,现在改为 ctrl + 上箭头或下箭头 实现起来稍微有些麻烦 实现 需要安装 macros 插件 这 ...
- nginx四层和七层负载的配置
四层负载和七层负载是两种不同类型的负载均衡策略,它们分别在网络的不同层次上工作.在Nginx中,这两种负载均衡策略可以通过配置nginx.conf文件来实现. 四层负载(L4 Load Balanci ...
- 1.Arduino ESP32配置环境
ESP32开发板管理器地址 https://dl.espressif.com/dl/package_esp32_index.json // 无效时可以使用下面这个 https://raw.github ...
- BES2500开发板介绍和入门
一 前记 BES2500是恒玄科技推出的款高端的TWS耳机芯片,该芯片的性能非常强悍.蓝牙5.2双模,1.8M的SRAM空间,ARM-M33的主核,绝对是音频耳机芯片中的高配,性能不是一般的强.该芯片 ...
- python处理txt文件常用方法总结
一 打开txt的正确方式 一般人会用到怎么快速打开txt,下面分享两种方式: f = open("data.txt","r") #设置文件对象 f.close( ...
- 如何在forEach内使用异步调用 async/await
翻自: How to use async and await in a forEach JS loop? https://learn.coderslang.com/0144-how-to-use-as ...
- 一个.net6开发的截图后ocr小工具
软件使用 .net6 winfrom 开发 ocr使用的是paddleOCR .net下调用paddleOCR 用 sdcb.PaddleOCR https://github.com/sdcb/Pad ...
- 三维模型3DTile格式轻量化压缩处理的数据质量提升方法分析
三维模型3DTile格式轻量化压缩处理的数据质量提升方法分析 在处理三维模型3DTile格式的轻量化压缩时,如何在减少数据量的同时,保证或提升数据质量是一大挑战.以下为一些提升数据质量的方法分析: 改 ...
- 降低FTP服务器速度的解决方案(Filezilla等)
我最近发现,尽管有70Mbps(8.75MB / s)的互联网连接和1Gbps(125MB / s)的专用服务器可以从中下载,但我似乎只能从FTP服务器上以大约16.8Mbps(2.1MB / s)的 ...
- 整合mybatis-spring需要的maven依赖配置
创建maven项目,导入相关jar包 junit 1 <dependency> 2 <groupId>junit</groupId> 3 <artifactI ...