CF1928D Lonely Mountain Dungeons

提供一个三分做法。

假设我们已经知道了分 \(x\) 队,那对于每一个种族,我们就应该尽量平均分到这 \(x\) 个队伍中。我们可以先将总数 \(c_i\) 平均分,再把余数 \(r\) 分给前 \(r\) 个元素,每个元素分一个 \(1\)。

然后,我们需要统计答案。我们发现这是一个类似带权数线段的计数,所以我们对于平均分之后的数维护一个后缀和。每处理到一个数时,将后缀和减去这个数,并用这个数乘以后缀和乘以 \(b\) 累加到答案中。这个过程的时间复杂度是 \(O(c_i)\) 的,由于题目保证 \(\sum c_i\le2\times10^5\),这个时间复杂度可以接受。

接下来,我们考虑优化寻找答案的过程。记分 \(x\) 队的战斗力为 \(F_x\),可以证明 \(F_x\) 为单峰函数。当前分的队数越多,扩一个队能增加的收益就越少。因为同一个队不可以贡献的对数是该队人数平方级别的,分的队数越多,平均分人数减少越慢。但是扩一个队的代价一定,所以答案的差分是递减的。因此,\(F_x\) 为单峰函数。

既然答案是单峰的,直接三分即可。

#include <bits/stdc++.h>
using namespace std;
long long t,n,b,x,a[300000];
long long check(long long w)
{
long long ans=0;
if(w==0)return 0;
for(int i=1;i<=n;i++)
{
long long tol=a[i],s=a[i]/w,r=a[i]%w;
for(int i=1;i<=r;i++)tol-=(s+1),ans+=(s+1)*tol;
while(tol>0)tol-=s,ans+=s*tol;
}
return ans*b-x*(w-1);
} int main()
{
scanf("%lld",&t);
while(t--)
{
long long ans=0,mx=0;
scanf("%lld%lld%lld",&n,&b,&x);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
mx=max(mx,a[i]);
}
long long l=0,r=mx;
while(l<=r)
{
long long mid1=(l*2+r)/3,mid2=(l+r*2)/3;
if(check(mid1)<=check(mid2))ans=max(ans,check(mid2)),l=mid1+1;
else r=mid2-1;
}
printf("%lld\n",ans);
}
return 0;
}

感谢 sunrise1024 提供的证明。

CF1928D Lonely Mountain Dungeons 题解的更多相关文章

  1. Codeforces Gym 100269A Arrangement of Contest 水题

    Problem A. Arrangement of Contest 题目连接: http://codeforces.com/gym/100269/attachments Description Lit ...

  2. Smallest Difference(暴力全排列)

    Smallest Difference Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10387   Accepted: 2 ...

  3. POJ 2002 Squares [hash]

    Squares Time Limit: 3500MS   Memory Limit: 65536K Total Submissions: 16631   Accepted: 6328 Descript ...

  4. 算法与数据结构基础 - 深度优先搜索(DFS)

    DFS基础 深度优先搜索(Depth First Search)是一种搜索思路,相比广度优先搜索(BFS),DFS对每一个分枝路径深入到不能再深入为止,其应用于树/图的遍历.嵌套关系处理.回溯等,可以 ...

  5. 算法与数据结构基础 - 数组(Array)

    数组基础 数组是最基础的数据结构,特点是O(1)时间读取任意下标元素,经常应用于排序(Sort).双指针(Two Pointers).二分查找(Binary Search).动态规划(DP)等算法.顺 ...

  6. 【题解】Mountain Walking-C++

    题目题意翻译题意简述:现在给一个N*N的矩阵,找一条路径从左上角走到右下角,每次可以向上下左右四个方向中某个方向走.要求走过的点中,数字最大的减去最小的.要求值越小越好.现在就是要求这个值. 输入格式 ...

  7. [USACO 12JAN]Mountain Climbing

    Description Farmer John has discovered that his cows produce higher quality milk when they are subje ...

  8. LeetCode All in One题解汇总(持续更新中...)

    突然很想刷刷题,LeetCode是一个不错的选择,忽略了输入输出,更好的突出了算法,省去了不少时间. dalao们发现了任何错误,或是代码无法通过,或是有更好的解法,或是有任何疑问和建议的话,可以在对 ...

  9. LeetCode 531. Lonely Pixel I

    原题链接在这里:https://leetcode.com/problems/lonely-pixel-i/ 题目: Given a picture consisting of black and wh ...

  10. LeetCode 845. Longest Mountain in Array

    原题链接在这里:https://leetcode.com/problems/longest-mountain-in-array/ 题目: Let's call any (contiguous) sub ...

随机推荐

  1. Innodb快速复习

    放一张官方架构图: 参考文章: 一文带你了解MySQL之InnoDB_Buffer_Pool-阿里云开发者社区这一篇buffer pool讲解的很好 [动画演示:MySQL的BufferPool和Ch ...

  2. .Net Core环境绑定及配置launchSettings.json

    1.Asp.net Core的默认环境配置在项目Properties-->launchSettings.json下 { "$schema": "http://jso ...

  3. 使用PowerShell开发脚本程序进行批量SVN提交

    使用PowerShell开发脚本程序进行批量SVN提交 随着软件开发的不断进步,版本控制系统如Subversion (SVN) 成为了团队协作和代码管理的重要工具.当需要一次性提交大量文件时,手动操作 ...

  4. Spring基于注解的CRUD

    目录 Spring基于注解的CRUD 代码实现 测试 方式一:使用Junit方式测试 方式二:使用@RunWith(SpringJUnit4ClassRunner.class)注解测试 Spring基 ...

  5. 通用的servlet

    1 通用的servlet实现的原理 2 实例 2.1 目录结构 2.2 BaseServlet.java 2.3 ServletDemo.java 2.4 index.html 2.5 test.ht ...

  6. 鸿蒙NEXT开发实战教程—文字识别

    今天跟大家分享一个ocr文字识别的小项目: 鸿蒙系统提供了文字识别的能力,支持简体中文.英文.日文.韩文.繁体中文五种语言.实现步骤为初始化文字识别服务.将图片转换为PixelMap.文字识别.释放O ...

  7. 堆叠、MLAG、VPC、VSS 技术对比及架构建议

    堆叠.MLAG.VPC.VSS 技术对比及架构建议 1. 堆叠(Stacking) 技术实现: 多台物理设备通过专用堆叠线缆(如华为的Stack.华三IRF.思科StackWise)或普通光纤/以太网 ...

  8. Join 实现 2 表数据联动

    最近在做一个简单的报表, 用的工具是帆软报表, 一开始觉得有点low, 现在看看还行, 除了界面真的太丑外, 其它还要, 这种大量要使用 sql 的方式, 我觉得是非常灵活高效的, I like . ...

  9. RPC实战与核心原理之优雅启动

    优雅启动:如何避免流量打到没有启动完成的节点? 回顾 优雅停机,就是为了让服务提供方在停机应用的时候,保证所有调用方都能"安全"地切走流量,不再调用自己,从而做到对业务无损.其中实 ...

  10. 构建现代交互式平台:CodeBuddy如何简化复杂系统开发

    我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 交互式平台的架构挑战 构建现代 ...