[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关键字创建字符串对象时, 每次申请 ...
随机推荐
- Mars Android 接入指南
Mars Android 接入指南 https://github.com/Tencent/mars/wiki/Mars-Android-%E6%8E%A5%E5%85%A5%E6%8C%87%E5%8 ...
- 手写MVC框架(二)-代码实现和使用示例
--------上一篇:手写MVC框架(一)-再出发----- 背景 书接上文,之前整理了实现MVC框架需要写哪些东西.这周粗看了一下,感觉也没多少工作量,所以就计划一天时间来完成.周末的时间,哪会那 ...
- 对于flex布局的使用心得
弹性盒子flex: 对于客户端的布局非常有用,不管是平均分配space-around这个属性还是两端对齐space-betwee在页面布局的时候都会有很好的表现. 对于部分内容区域中,具有很多大致内容 ...
- 3.用Python画五角星
import turtleimport timeimport os #def draw_square(org_x, org_y, x, y): turtle.setpos(org_x, org_y) ...
- 个人项目(JAVA实现)
一:Github项目地址:https://github.com/candy07213/WC 二:PSP表格 PSP2.1 Personal Software Process Stages 预估耗时(分 ...
- ES读写索引内幕分析
一.简介 ES中的索引都进行分片,每个分片都会保存多个副本.这些副本称为复制组,在添加或删除索引时必须同步副本.如果不这样,从不同的副本中读取的索引可能截然不同.保持分片副本同步并从中提供读取的过程被 ...
- Navicat链接数据库报错1130解决方案
1.背景 使用localhost 可以正常连接mysql服务器,但是使用ip地址连接保存如下: 2.问题原因 默认情况下root用户只允许本机访问,即使用localhost访问,如下图: 解决方案:将 ...
- JanusGraph多图配置 (cassandra)
JanusGraph多图配置目的 :一个端口开启后可根据句柄操作多个图 .(cassandra存储后端) 1.GremlinServer多图配置 服务器gremlin-server.yaml中可以设置 ...
- CentOS7下的AIDE入侵检测配置
一.AIDE的概念 AIDE:Advanced Intrusion Detection Environment,是一款入侵检测工具,主要用途是检查文档的完整性.AIDE在本地构造了一个基准的数据库,一 ...
- 利用SQL直接生成模型实体类
在网上找来一个别人写好的,生成实体类的SQL代码 declare @TableName sysname = 'lkxxb' declare @Result varchar(max) = 'public ...