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 ...
随机推荐
- 摆脱鼠标系列 - Alt + N 快速切换vscode多个项目 - HotKeyP
摆脱鼠标系列 - Alt + N 快速切换vscode多个项目 用的软件是 HotKeyP 打开软件选择vscode vscode里面的 project那个插件也很好,但是需要打开vscode以后,这 ...
- 基于BES2500芯片的方案开发总结和反思
前记 虽然蓝牙芯片现在非常多,可是一旦想做一些差异化的产品时候,能用的非常少.在和客户的反复斟酌中,最终选择了BES2500来开发这款新的产品.这里面是基于自身的实力,产品定位和芯片诉求多重考量的 ...
- 【个人笔记】Nestjs使用TypeORM注意点
在Nestjs使用TypeORM还是有一些注意点. entities路径配置注意点 在nestjs中使用TypeORM,需要配置数据库连接(以MySQL为例).需要特别注意的是配置参数里面的entit ...
- CSS(精灵图、字体图标、三角、用户界面样式、vertical-align、溢出省略号、常用布局技巧、初始化 )
一. 精灵图(重点) 1.1 为什么需要精灵图 一个网页中往往会应用很多小的背景图像作为修饰,当网页中的图像过多时,服务器就会频繁地接收和发送请求图片,造成服务器请求压力过大,这将大大降低页面的加载速 ...
- 三维模型3DTile格式轻量化的数据压缩与性能平衡关系分析
三维模型3DTile格式轻量化的数据压缩与性能平衡关系分析 对于三维模型的3DTile格式轻量化处理,数据压缩和性能之间的平衡关系是一个重要的考虑因素.以下是这两者关系的详细分析: 1.数据压缩与加载 ...
- 你的DDPG/RDPG为何不收敛?
园子好多年没有更过了,草长了不少.上次更还是读博之前,这次再更已是博士毕业2年有余,真是令人唏嘘.盗链我博客的人又见长,身边的师弟也问我挖的几个系列坑什么时候添上.这些着实令我欣喜,看来我写的东西也是 ...
- JS 为什么0==““ 会是true
0 是逻辑的 false 1 是逻辑的 true空字符串是逻辑的 false null 是逻辑的 false NaN==任何 都是false 所以:空字符串是逻辑的 false , 0是逻辑的fals ...
- verilog之monitor
verilog之monitor 1.函数作用 monitor用于追踪变量的变化情况,这在实际使用中还是非常实用的.电路中的某个信号的变化可以通过monitor检测,不需要使用波形图去仔细查找.也便于准 ...
- PS的流水灯设计分析
PS的流水灯设计分析 1.实验原理 PS设计流水灯就是采用ARM的硬核实现流水灯设计.ARM内核采用的就是一个可以执行软件程序的平台.这里采用C语言设计.基于前面构建的GPIO外设的硬件平台,这里实现 ...
- WebRTC开源框架
1.什么是WebRTC WebRTC (Web Real-Time Communications)是一项实时通讯的技术,旨在使得浏览器能为实时通信提供简单的JavaScript接口,让浏览器通过JS实 ...