[300iq contest1-J]Jealous Split
题意
有一个非负整数序列\({a_i}\),你要将他分成恰好\(k\)段,记\(s_i\)为第\(i\)段的和,\(m_i\)为第\(i\)段的最大值,你需要保证这种划分方案对任意\(1 \le i < k\)满足:\(|s_i-s_{i+1}|\le \max(m_i,m_{i+1})\)
\(3 \leq k \leq n \leq 100\,000\)
传送门
思路
题解中的给出的分割为和的平方最小的,请自星阅读,其实最终实现方法也可以互通
我们定义“对序列进行一次\(x\)划分”为(从前往后或从后往前)扫一遍序列,每当权值和大于等于\(x\)就分一段。
二分出最大的\(x\)满足划分后段数\(\ge k\)(注意不算最后的和不到的零头段),令其为\(mid\)。
如果对序列进行\(mid\)划分后序列被恰好分成了\(k\)段,那么这种划分方案在原问题下就是最优的且合法的。
证明:考虑两段划分,\(mid-x_i\)表示除最后一个外的和(\(x_i >0\)),那么\(mid-x_i+last_i-(mid-x_{i+1}+last_{i+1})\le last_i \leq m_i\)。所以一定是小于等于最大值的
若不满足,则可以对序列倒着做\(mid+1\)分段,通过某种方式(这里的证明比较随意,感性理解一下)可以证明正着做\(mid\)分段与倒着做\(mid+1\)分段存在至少一个公共划分点,且满足用前者划分的一段前缀拼上后者划分的一段后缀恰好可以得到原问题的一组合法解。
一波乱证:因为二分出的是最大的答案,\(mid+1\)划分个数\(k-a(a>0)\)肯定小于\(mid\)划分个数\(k+b(b \ge 0)\)
反证
如果没有重合点,那么肯定有一段\(mid+1\)划分会包含\(mid\)划分(左右端点不同的),但是可知\(mid\)划分加上一个正整数(在贪心过程中0不会出现在\(mid\)右端点以及\(mid+1\)左端点,可以忽略)肯定可以\(\ge mid+1\),而这里多加了至少两个数所以矛盾
然后要使加起来个数=k的话每出现一个重合点块数就会-1或-0(一段都重合),不出现就不会,换句话说,每一个使块数\(-1\)的点都是重合点。因为\((l_{mid}<l_{mid+1},r_{mid}<r_{mid+1})\),所以一定能找到一个重合点,使得两者加起来刚好为k
至于代码那是非常的简短,但是这思路也是神仙了
#include <bits/stdc++.h>
typedef long long ll;
const int N=100005;
int n,a[N],p[N],p2[N],k;
long long l,r,ans;
int check(ll x){
ll sum=0;int cnt=0;
for (int i=1;i<=n;i++){
sum=sum+a[i];
if (sum>=x) cnt++,sum=0;
}
return cnt;
}
int main(){
scanf("%d%d",&n,&k);
for (int i=1;i<=n;i++) scanf("%d",&a[i]),r=r+a[i];
while (l<=r){
ll mid=(l+r)>>1;
if (check(mid)>=k){
ans=mid;
l=mid+1;
}else r=mid-1;
}
puts("Yes");
ll sum=0;int cnt=0;
for (int i=1;i<=n;i++){
sum=sum+a[i];
if (sum>=ans) p[++cnt]=i,sum=0;
}
if (p[cnt]==n && cnt==k){
for (int i=1;i<cnt;i++) printf("%d ",p[i]);
puts("");
return 0;
}
sum=0;int cnt2=0;
for (int i=n;i>=1;i--){
sum=sum+a[i];
if (sum>=ans+1) p2[++cnt2]=i,sum=0;
}
for (int i=1;i<=cnt;i++){
if (p[i]==p2[k-i]-1){
for (int j=1;j<=i;j++) printf("%d ",p[j]);
for (int j=k-i-1;j>=1;j--) printf("%d ",p2[j]-1);
puts("");
break;
}
}
return 0;
}
后记
想不到系列
[300iq contest1-J]Jealous Split的更多相关文章
- 2016 Al-Baath University Training Camp Contest-1 J
Description X is fighting beasts in the forest, in order to have a better chance to survive he's gon ...
- 300iq Contest 1 简要题解
300iq Contest 1 简要题解 咕咕咕 codeforces A. Angle Beats description 有一张\(n\times m\)的方阵,每个位置上标有*,+,.中的一种. ...
- React使用antd Table生成层级多选组件
一.需求 用户对不同的应用需要有不同的权限,用户一般和角色关联在一起,新建角色的时候会选择该角色对应的应用,然后对应用分配权限.于是写了一种实现的方式.首先应用是一个二级树,一级表示的是应用分组,二级 ...
- 利用poi导出Excel
import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.r ...
- BZOJ3197 & 组合乱搞
Description 求\[\sum_{i = 1}^{n}i^m m^i , m \leq 1000 \] 的值.Solution From Miskcoo's Space: ...
- JavaScript状态机程序逻辑编辑器
制作背景 之前做Win8 Metro动态加载内容框架的时候,由于采用了XAML+JavaScript的方法,程序复杂的执行逻辑是由JavaScript控制的,而页面一多,流程一复杂,制作起来就非常麻烦 ...
- Python开发【前端】:JavaScript
JavaScript入门 JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本 ...
- Winform-DataGridView 实现如Excel的粘贴复制
void AddDataGridView(DataGridView gridView, string s) { s = s.Replace("/", @"\") ...
- java动手动脑和课后实验型问题String类型
1.请运行以下示例代码StringPool.java,查看其输出结果.如何解释这样的输出结果?从中你能总结出什么? true true false 总结: 使用new关键字创建字符串对象时, 每次申请 ...
随机推荐
- css3实现半圆和圆效果
在css2中,如果需要失效一些圆角或者半圆等等效果,一般是要通过ps等软件来处理的,在CSS3中,则不需要了,只需要通过border-radius就可以实现,大大方便了开发的效率. 无论圆角.圆弧.实 ...
- Newtonsoft.Json.Linq.JObject 遍历验证每个属性内容
业务需求,拦截器验证每个请求inputstream(实际是application/json流)的数据,但是json反序列化实体格式不同. var req = filterContext.Request ...
- 关于ABViewer的疑问解答
很多 CAD小伙伴都对 ABViewer 这款软件不陌生吧.ABViewer 是用来处理图纸和工程文档管理的一款通用软件.可以用它来查看,编辑,转换,测量和打印DWG和其他CAD文件,以及3D模型和光 ...
- 移动应用开发中AppID、AppKey、AppSecret
ppID:应用的唯一标识AppKey:公匙(相当于账号)AppSecret:私匙(相当于密码) token:令牌(过期失效) 使用方法 1. 向第三方服务器请求授权时,带上AppKey和AppSecr ...
- MYSQL5.7生成列简介及创建
1.说明 生成列是由已存在的字段通过表达式计算得来的 2.生成列类型 VIRTUAL,即虚拟类型,字段值不实际存储,当读取行时再计算,虚拟列类型不占存储 STORED,即存储类型,字段值会实际存储起来 ...
- 04-JavaScript的操作
本篇主要介绍获取元素的方法.操作元素.数组和字符串的操作方法.定时器和封闭函数.以及贪吃蛇案例: 一.获取元素的方法 1.document.getElementById:可以使用内置对象documen ...
- docker容器监控:cadvisor+influxdb+grafana
cadvisor+influxdb+grafana可以实现容器信息获取.存储.显示等容器监控功能,是目前流行的docker监控开源方案. 方案介绍 cadvisor Google开源的用于监控基础设施 ...
- Docker存储卷篇
Docker存储卷篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.写时复制(COW)机制 所谓写时复制的效果如上图所示: Docker镜像由多个只读层叠加而成,启动容器 ...
- sqliteman install parameter
.安装前准备 系统要求:linux Qt库版本:一般都有 .安装文件 官网自行下载 .安装 )这里用的pscp pscp .\sqliteman-.tar.gz root@192.168.30.140 ...
- 团队项目-Beta冲刺
请大家在每次作业开头添加格式描述: 这个作业属于哪个课程 <课程的链接> 这个作业要求在哪里 <作业要求的链接> 团队名称 <写上团队名称>(附上团队博客链接) 这 ...