题意

给定一个长度为 \(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. 【FLASK】使用ORM以及类似于Django更新新增字段

    #!/usr/bin/env python # -*- coding:utf-8 -*- from sqlalchemy.ext.declarative import declarative_base ...

  2. 开源 C#工作流管理平台

    { font-family: 宋体; panose-1: 2 1 6 0 3 1 1 1 1 1 } @font-face { font-family: "Cambria Math" ...

  3. Java知识系统回顾整理01基础04操作符04位操作符

    一.位操作符 位操作符在实际工作中用的并不常见,但是我比较纠结这些位操作.所以实际练习位操作符的每一个操作符的操作实例来理解其具体含义. 建议: 如果确实感兴趣,就看看,个人建议跳过这个章节. 真正工 ...

  4. CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths 树上启发式合并(DSU ON TREE)

    题目描述 一棵根为\(1\) 的树,每条边上有一个字符(\(a-v\)共\(22\)种). 一条简单路径被称为\(Dokhtar-kosh\)当且仅当路径上的字符经过重新排序后可以变成一个回文串. 求 ...

  5. 14.深入k8s:kube-proxy ipvs及其源码分析

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 源码版本是1.19 这一篇是讲service,但是基础使用以及基本概念由于官方实在是写的 ...

  6. DX12龙书 01 - 向量在几何学和数学中的表示以及运算定义

    0x00 向量 向量 ( vector ) 是一种兼具大小 ( magnitude ) 和方向的量. 0x01 几何表示 几何方法中用一条有向线段来表示一个向量,其中,线段长度代表向量的模,箭头的指向 ...

  7. 详解工程师不可不会的LRU缓存淘汰算法

    大家好,欢迎大家来到算法数据结构专题,今天我们和大家聊一个非常常用的算法,叫做LRU. LRU的英文全称是Least Recently Used,也即最不经常使用.我们看着好像挺迷糊的,其实这个含义要 ...

  8. 是时候更新手里的武器了—Jetpack最全简析

    前言 Android Jetpack想必大家都耳熟能详了,Android KTX,LiveData,Room等等一系列库都是出自 Jetpack.那么 Jetpack到底是什么?又包含哪些你还没用过的 ...

  9. Golang 随机生成中国人姓名

    package main import ( "fmt" "math/rand" "time" ) var lastName = []stri ...

  10. fastdfs之同一台storage server下包含多个store path

    一,查看本地centos的版本 [root@localhost lib]# cat /etc/redhat-release CentOS Linux release 8.1.1911 (Core) 说 ...