题意

给定一个长度为 \(n\) 的序列 \(a\) 和一个整数 \(k\),构造一个序列 \(b\) 使得满足以下条件:

  • \(0\leq b_i\leq a_i\)

  • \(\sum\limits_{i=1}^{n}b_i=k\)

最大化 \(\sum\limits_{i=1}^{n}a_ib_i-b_i^3\)。

\(\texttt{Data Range:}n\leq 10^5,k\leq 10^{14}\)

题解

神仙题。

考虑先设 \(b_i\) 为 \(0\),相当于能操作 \(k\) 次,每次能把某个 \(b_i+1\)。

考虑设 \(f(i,x)=a_ix-x^3\),那么我们有

\[\Delta f(i,x)=a_i-3x^2+3x-1
\]

注意到这东西在整数域上是单调递减的,于是可以按照求最大函数值的那个套路来,但是时间复杂度是 \(O(k\log n)\) 的,无法通过。

注意到我们取出来的最大函数值值是单调不升的,所以可以考虑二分一下最后一次操作对答案的贡献是什么。对于当前考虑的值我们可以通过二分来解一下某个 \(i\) 至少需要操作几次才能大于等于这个最大增量,最后 check 一下 \(\sum b_i\) 就好了。

然后由于最大函数值单调不升而不是单调递减,所以外面的二分最好不要二分到一个确切的值,而是二分到一个长度为 \(2\) 的区间,然后在 check 两个端点。

这样子可能有些时候操作次数还有剩余,于是就可以最后调整一下值就差不多了。

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
const ll MAXN=2e5+51,inf=1e18;
ll n,kk,l,r,mid,sm;
ll u[MAXN],v[MAXN];
inline ll read()
{
register ll num=0,neg=1;
register char ch=getchar();
while(!isdigit(ch)&&ch!='-')
{
ch=getchar();
}
if(ch=='-')
{
neg=-1;
ch=getchar();
}
while(isdigit(ch))
{
num=(num<<3)+(num<<1)+(ch-'0');
ch=getchar();
}
return num*neg;
}
inline ll f(ll u,ll x)
{
return u==x?inf:u-3*x*x+3*x-1;
}
inline ll calc(ll x,ll lim)
{
ll l=1,r=u[x],mid,res=u[x];
while(l<=r)
{
mid=(l+r)>>1;
f(u[x],mid)<=lim?r=mid-1,res=mid:l=mid+1;
}
return res;
}
inline ll check(ll mid)
{
sm=0;
for(register int i=1;i<=n;i++)
{
sm+=(v[i]=calc(i,mid));
}
return sm<kk;
}
int main()
{
n=read(),kk=read();
for(register int i=1;i<=n;i++)
{
u[i]=read(),l=min(l,f(u[i],u[i]-1)),r=max(r,f(u[i],0));
}
while(r-l>=2)
{
mid=(l+r)>>1;
check(mid)?r=mid:l=mid;
}
r=check(l)?l:r,check(r),kk-=sm;
for(register int i=1;i<=n;i++)
{
kk&&v[i]<u[i]&&f(u[i],v[i])==r?v[i]++,kk--:1;
}
for(register int i=1;i<=n;i++)
{
printf("%lld ",v[i]);
}
}

CodeForces 1344D Résumé Review的更多相关文章

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

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

  2. Codeforces Round #380 (Div. 1, Rated, Based on Technocup 2017 - Elimination Round 2)

    http://codeforces.com/contest/737 A: 题目大意: 有n辆车,每辆车有一个价钱ci和油箱容量vi.在x轴上,起点为0,终点为s,中途有k个加油站,坐标分别是pi,到每 ...

  3. Codeforces Gym 100803D Space Golf 物理题

    Space Golf 题目连接: http://codeforces.com/gym/100803/attachments Description You surely have never hear ...

  4. Codeforces Round #321 (Div. 2) B. Kefa and Company 二分

    B. Kefa and Company Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/580/pr ...

  5. Codeforces Round #276 (Div. 1) E. Sign on Fence (二分答案 主席树 区间合并)

    链接:http://codeforces.com/contest/484/problem/E 题意: 给你n个数的,每个数代表高度: 再给出m个询问,每次询问[l,r]区间内连续w个数的最大的最小值: ...

  6. Codeforces 438D The Child and Sequence - 线段树

    At the children's day, the child came to Picks's house, and messed his house up. Picks was angry at ...

  7. CodeForces - 798D Mike and distribution 想法题,数学证明

    题意:给你两个数列a,b,你要输出k个下标,使得这些下标对应的a的和大于整个a数列的和的1/2.同时这些下标对应的b //题解:首先将条件换一种说法,就是要取floor(n/2)+1个数使得这些数大于 ...

  8. [Codeforces 7E] Defining Macros

    Link:http://codeforces.com/problemset/problem/7/E Brief Introduction:一个表达式由多个“Macros”组成,每个Macro都为一个整 ...

  9. codeforces B. Ciel and Flowers 解题报告

    题目链接:http://codeforces.com/problemset/problem/322/B 题目意思:给定红花.绿花和蓝花的朵数,问组成四种花束(3朵红花,3朵绿花,3朵蓝花,1朵红花+1 ...

随机推荐

  1. 使用eclipse启动tomcat,正常模式下可以启动tomcat,却在debug模式下无法启动tomcat 问题解决

    这个问题可能是由于eclipse和tomcat的交互而产生的,在以debug模式启动tomcat时,发生了读取文件错误,eclipse自动设置了断点,导致tomcat不能正常启动. 解决方法把brea ...

  2. LDA主题模型困惑度计算

    对于LDA模型,最常用的两个评价方法困惑度(Perplexity).相似度(Corre). 其中困惑度可以理解为对于一篇文章d,所训练出来的模型对文档d属于哪个主题有多不确定,这个不确定成都就是困惑度 ...

  3. java版app自动化测试初始化模板

    项目目录介绍 目录结构如下: (包含:驱动的基础配置.全局异常处理.异常截图.报告自动生成.app常用操作方法封装.常用工具类封装) 各包分层关系 basepage包负责存放app公共操作方法.And ...

  4. web框架推导

    django 引言 所有的web应用本质上就是一个socket服务端,而用户的浏览器. 软件开发架构 cs架构 bs架构 本质上,bs架构也是cs架构 http协议 网络协议 http协议 数据传输是 ...

  5. Layman 分享到朋友圈或发送给朋友

    *主要是介绍如何在网页中实现发送给朋友和分享到朋友圈时内容参数自定义的功能 微信JS接口 1.微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包; 通过使用微信JS-SDK, ...

  6. VS2013 c++ 生成和调用DLL动态链接库(.def 方法已验证OK)

    转载:https://blog.csdn.net/zhunianguo/article/details/52294339 .def 方法 创建动态库方法: 创建动态库是生成 .dll .lib 两个个 ...

  7. opencv中namedWindow( )函数

    转自:https://blog.csdn.net/fanjiule/article/details/81606596 第一步,功能说明:namedWindow()的功能就是新建一个显示窗口.可以指定窗 ...

  8. 9.23 T1 tree

    题意描述: 给你一个长度为 \(n\) 的序列,让你从中选出 \(k\) 个数组成一个集合,定义这个集合的极限高度为\(a_i...a_k\) 的最大值. 让你求所有的集合极限高度 之和对 \(100 ...

  9. SpringCache整合Redis

    之前一篇文章 SpringBoot整合Redis 已经介绍了在SpringBoot中使用redisTemplate手动 操作redis数据库的方法了.其实这个时候我们就已经可以拿redis来做项目了, ...

  10. mycat的privileges标签

    参考https://blog.csdn.net/tornadojava/article/details/54948662 privileges标签 对用户的 schema以及表进行精细化的DML权限控 ...