Square Price:垃圾卡精度,垃圾卡精度,垃圾卡精度,傻逼出题人,傻逼出题人,傻逼出题人,傻逼出题人,傻逼出题人,傻逼出题人,傻逼出题人。

ll__int128WA*22,改 __int128 直接 AC 了,难评。

抛开卡精度这题还是挺好的。

暴力

先考虑暴力思路,显然暴力应该这么打:把所有物品全丢进优先队列里,每次选出价值最小的物品,把多选择一个的物品的价值与当前数量的物品价值做差,丢进优先队列。一直执行直到不能选为止。

显然可以构造全 \(1\) 的数据来把它卡爆,不能过。

正解

考虑优化暴力的过程,不难发现,我们最后取出的结果,代价一定小于等于某一个值。而每个元素选的越多,每一个的代价就越多,因此我们可以二分出最后选出的最大代价,设为 \(mx\)。假设当前在计算第 \(i\) 个元素在此限制下最多能选 \(k\) 个该元素,则可以得到下列不等式:

\[p_i\times(k^2-(k-1)^2)\le mx
\]
\[p_i\times(2k-1)\times 1 \le mx
\]
\[2k-1 \le \frac{mx}{p_i}
\]
\[k \le \frac{mx}{2\times p_i}+\frac{1}{2}
\]

因此,我们就可以求出 \(k\) 了,之后在 check 时将当前答案加上 \(k^2\times p_i\),最后看答案是否小于等于 \(m\) 即可。

最后统计答案的时候,因为二分时默认所有选的代价都小于等于 \(mx\),那么如果 \(mx\) 后面的还有剩余,就还要加上这一部分的答案。

时间复杂度 \(O(n \log V)\)。

注意精度问题,要开 __int128long double,二分边界记得开大!

总结

不论精度问题的话,这题还挺巧妙的。这题能用二分代替优先队列的关键就在于下列几点:

  • 是取所有价值中的前 \(x\) 小值,具有单调性。
  • 单个元素的贡献能被快速计算。
  • 单个元素的代价具有单调性。

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define lc (p<<1)
#define rc ((p<<1)|1)
#define eb(x) emplace_back(x)
#define pb(x) push_back(x)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
using pi=pair<int,int>;
using pl=pair<ll,pair<ll,pair<ll,ll> > >;
ll n,m,p[200005],res=0;
bool check(ll mx)
{
res=0;
__int128 now=0;
for(int i=1;i<=n;i++)
{
__int128 k=max(__int128(0),__int128(floor(ldb((ldb(1.0*mx)/ldb(p[i])+1.0))/ldb(2.0))));
now+=k*k*p[i];
if(now>m)return 0;
res=res+k;
}
return 1;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>p[i];
ll l=0,r=1e15,mid;
while(l<r)
{
mid=(l+r+1)>>1;
if(check(mid))l=mid;
else r=mid-1;
}
res=0;
__int128 now=0;
for(int i=1;i<=n;i++)
{
ll k=max(__int128(0),__int128(floor(ldb((ldb(1.0*l)/ldb(p[i])+1.0))/ldb(2.0))));
now+=__int128(k)*__int128(k)*__int128(p[i]);
res+=k;
}
for(int i=1;i<=n;i++)
{
__int128 kx=max(__int128(0),__int128(floor(ldb((ldb(1.0*l)/ldb(p[i])+1.0))/ldb(2.0))));
__int128 ky=max(__int128(0),__int128(floor(ldb((ldb(1.0*(l+1))/ldb(p[i])+1.0))/ldb(2.0))));
__int128 cst=__int128(ky)*__int128(ky)*__int128(p[i]),oricst=__int128(kx)*__int128(kx)*__int128(p[i]);
if(kx!=ky&&now-oricst+cst<=m)
{
now=now-oricst+cst;
res++;
}
}
cout<<res;
return 0;
}

Atcoder ABC389E Square Price 题解 [ 蓝 ] [ 二分 ] [ 贪心 ]的更多相关文章

  1. leetcode1552题解【二分+贪心】

    leetcode1552.两球之间的磁力 题目链接 算法 二分+贪心 时间复杂度O(nlogn + nlogm) 1.根据题意描述,我们需要将m个球放入到n个篮子中,根据题目中数据范围描述发现m &l ...

  2. Codeforces_732D_(二分贪心)

    D. Exams time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...

  3. Codeforces Gym 100231B Intervals 线段树+二分+贪心

    Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...

  4. 【HDU 4898】 The Revenge of the Princess’ Knight (后缀数组+二分+贪心+...)

    The Revenge of the Princess’ Knight Problem Description There is an old country and the king fell in ...

  5. ZOJ 4062 - Plants vs. Zombies - [二分+贪心][2018 ACM-ICPC Asia Qingdao Regional Problem E]

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4062 题意: 现在在一条 $x$ 轴上玩植物大战僵尸,有 $n$ ...

  6. AtCoder ExaWizards 2019 简要题解

    AtCoder ExaWizards 2019 简要题解 Tags:题解 link:https://atcoder.jp/contests/exawizards2019 很水的一场ARC啊,随随便便就 ...

  7. Codeforces Round #412 (rated, Div. 2, base on VK Cup 2017 Round 3) A B C D 水 模拟 二分 贪心

    A. Is it rated? time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  8. 【BZOJ】1650: [Usaco2006 Dec]River Hopscotch 跳石子(二分+贪心)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1650 看到数据和最小最大时一眼就是二分... 但是仔细想想好像判断时不能贪心? 然后看题解还真是贪心 ...

  9. 【bzoj2097】[Usaco2010 Dec]Exercise 奶牛健美操 二分+贪心

    题目描述 Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的小路上奔跑.这些奶牛的路径集合可以被表示成一个点集和一些连接 两个顶点的双向路,使得每对点之间恰好有一条简单路径. ...

  10. CF732D Exams 二分 贪心

    思路:二分+贪心 提交次数:10次以上 错因:刚开始以为二分(边界,$+1or-1$)写错了,调了半天,后来才发现是$ck()$写错了.开始只判了最后是否小于零,而应该中间一旦小于零就$return\ ...

随机推荐

  1. PythonDay6Advance

    PythonDay6Advance 模块.类与对象 模块 内置模块 time, random, os, json 第三方模块 requests, pandas, numpy,.... 自定义模块 xx ...

  2. 构造SLR语法分析表

    构造SLR语法分析表 方法: 1)构造G'的规范LR(0)项集族 2)根据规则生成动作 3)生成转换 4)设置报错 /** * P157 规范LR(0)项集族 * @param grammar */ ...

  3. RAG分块策略:主流方法(递归、jina-seg)+前沿推荐(Meta-chunking、Late chunking、SLM-SFT)

    RAG分块策略:主流方法(递归.jina-seg)+前沿推荐(Meta-chunking.Late chunking.SLM-SFT) 大多数常用的数据分块方法(chunking)都是基于规则的,采用 ...

  4. win10下,更改程序磁贴图标

    win8.1后,Windows支持程序图标的定制显示. 一般我们制作win程序时,会给程序设定一个标准的icon,不过这个图标不能满足win10的图标显示需求了,现在我们就用qq为例,定制一下程序图标 ...

  5. R数据分析:生存数据的预测模型建立方法与评价

    之前写了生存分析列线图的做法,列线图作为一个预测模型可视化工具,我们使用它的过程其实就是一个给新数据做预测的过程,其内在本身的模型就是我们基于现有数据训练的一个预测模型,今天也算是接着上一篇文章继续写 ...

  6. Flutter & Xcode15-beta 冲突

    安装了Xcode15-beta后运行 Flutter 一直报有两个相同的文件冲突,这时候指定一下 Xcode-beta 的位置就好了 sudo xcode-select --switch /Appli ...

  7. .NET 6 探索 Minimal API 系列

    今天看到来自 https://www.dotnetdeveloper.cn/ 的一个 .NET 6 Minimal API 系列,感觉质量不错,特别收录在这里. .Net 6探索 (1) Minima ...

  8. 2024年1月Java项目开发指南8:统一数据返回格式

    有时候返回一个字符串,有时候返回一串数字代码,有时候返回一个对象-- 不过怎么说,我们返回的内容往往具有三个 1.消息代码 code 2.消息内容 msg 3.数据内容 data 接下来,我们要编写一 ...

  9. 【转载】 DirectByteBuffer内存释放

    http://www.tianshouzhi.com/api/tutorials/netty/331 我们已经知道,在网络编程中,为了避免频繁的在用户空间与内核空间拷贝数据,通常会直接从内核空间中申请 ...

  10. 微信小游戏直播在Android端的跨进程渲染推流实践

    本文由微信开发团队工程师"virwu"分享. 1.引言 近期,微信小游戏支持了视频号一键开播,将微信升级到最新版本,打开腾讯系小游戏(如跳一跳.欢乐斗地主等),在右上角菜单就可以看 ...