Atcoder ABC389E Square Price 题解 [ 蓝 ] [ 二分 ] [ 贪心 ]
Square Price:垃圾卡精度,垃圾卡精度,垃圾卡精度,傻逼出题人,傻逼出题人,傻逼出题人,傻逼出题人,傻逼出题人,傻逼出题人,傻逼出题人。
把 ll 改 __int128 前 WA*22,改 __int128 直接 AC 了,难评。
抛开卡精度这题还是挺好的。
暴力
先考虑暴力思路,显然暴力应该这么打:把所有物品全丢进优先队列里,每次选出价值最小的物品,把多选择一个的物品的价值与当前数量的物品价值做差,丢进优先队列。一直执行直到不能选为止。
显然可以构造全 \(1\) 的数据来把它卡爆,不能过。
正解
考虑优化暴力的过程,不难发现,我们最后取出的结果,代价一定小于等于某一个值。而每个元素选的越多,每一个的代价就越多,因此我们可以二分出最后选出的最大代价,设为 \(mx\)。假设当前在计算第 \(i\) 个元素在此限制下最多能选 \(k\) 个该元素,则可以得到下列不等式:
\]
\]
\]
\]
因此,我们就可以求出 \(k\) 了,之后在 check 时将当前答案加上 \(k^2\times p_i\),最后看答案是否小于等于 \(m\) 即可。
最后统计答案的时候,因为二分时默认所有选的代价都小于等于 \(mx\),那么如果 \(mx\) 后面的还有剩余,就还要加上这一部分的答案。
时间复杂度 \(O(n \log V)\)。
注意精度问题,要开 __int128 和 long 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 题解 [ 蓝 ] [ 二分 ] [ 贪心 ]的更多相关文章
- leetcode1552题解【二分+贪心】
leetcode1552.两球之间的磁力 题目链接 算法 二分+贪心 时间复杂度O(nlogn + nlogm) 1.根据题意描述,我们需要将m个球放入到n个篮子中,根据题目中数据范围描述发现m &l ...
- Codeforces_732D_(二分贪心)
D. Exams time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...
- Codeforces Gym 100231B Intervals 线段树+二分+贪心
Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...
- 【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 ...
- 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$ ...
- AtCoder ExaWizards 2019 简要题解
AtCoder ExaWizards 2019 简要题解 Tags:题解 link:https://atcoder.jp/contests/exawizards2019 很水的一场ARC啊,随随便便就 ...
- 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 ...
- 【BZOJ】1650: [Usaco2006 Dec]River Hopscotch 跳石子(二分+贪心)
http://www.lydsy.com/JudgeOnline/problem.php?id=1650 看到数据和最小最大时一眼就是二分... 但是仔细想想好像判断时不能贪心? 然后看题解还真是贪心 ...
- 【bzoj2097】[Usaco2010 Dec]Exercise 奶牛健美操 二分+贪心
题目描述 Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的小路上奔跑.这些奶牛的路径集合可以被表示成一个点集和一些连接 两个顶点的双向路,使得每对点之间恰好有一条简单路径. ...
- CF732D Exams 二分 贪心
思路:二分+贪心 提交次数:10次以上 错因:刚开始以为二分(边界,$+1or-1$)写错了,调了半天,后来才发现是$ck()$写错了.开始只判了最后是否小于零,而应该中间一旦小于零就$return\ ...
随机推荐
- django插件之django-import-export
文档:https://django-import-export.readthedocs.io/en/latest/getting_started.html#creating-import-export ...
- 接口压力测试工具之go-wrk
go-wrk 是一个用Go语言实现的轻量级的http基准测试工具,类似于wrk,本文将简单介绍一下如何使用go-wrk实现接口的性能(压力)测试. github地址:https://github.co ...
- seldom-platform:颠覆传统的自动化测试平台
seldom-platform:颠覆传统的自动化测试平台 seldom-platform是一个自动化测试平台,其特点是让会写代码的测试人员能够通过seldom框架高效地完成自动化用例的编写,并将剩下的 ...
- .NET周刊【12月第1期 2024-12-01】
我在.NET Conf China 2024 等你! .NET Conf China 2024 是一场面向开发人员的社区盛会,旨在庆祝 .NET 9 的发布,并回顾过去一年 .NET 在中国的发展成就 ...
- Kettle用查出来的数据自动创建表
Kettle在表输入的时候,写好很复杂的SQL,有种场景,就是想把这个很复杂的查出来的数据,自动创建一个表. 其实,操作步骤不复杂. 跟着我来做就是了. 1,新建表输出,Shift按住,从表输入拖动 ...
- 一款基于 .NET MVC 框架开发、功能全面的MES系统
前言 今天大姚给大家分享一款基于 .NET MVC 框架开发.功能全面的离散型零部件制造管理系统(MES):EasyMES. 项目介绍 EasyMES一款基于 .NET 6 MVC 框架开发.开源免费 ...
- 使用terraform管理Proxmox VE资源
terraform-proxmox 使用terraform管理proxmox资源 Using terraform to manage proxmox resources env: Proxmox VE ...
- 在app內建web server
这几年在三家企业都使用 app 內建 web server 的技术方案.效果很好. 该方案顾名思义,就是在 app 中加入一个 embed webserver 组件.组件和app运行于同一进程空间.程 ...
- Qt/C++开发经验小技巧286-290
国内站点:https://gitee.com/feiyangqingyun 国际站点:https://github.com/feiyangqingyun 很多时候项目越写越大,然后就可能遇到,明明之前 ...
- Qt音视频开发32-Onvif网络设置
一.前言 用onvif协议来对设备的网络信息进行获取和设置,这个操作在众多的NVR产品中,用的很少,绝大部分用户都还是习惯直接通过摄像机的web页面进去配置,其实修改网络配置的功能在大部分的NVR中都 ...