[HAOI2008]木棍分割

bzoj1044[HAOI2008]木棍分割 Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长度最小, 并且输出有多少种砍的方法使得总长度最大的一段长度最小. 并将结果mod 10007。。。 Input 输入文件第一行有2个数n,m. 接下来n行每行一个正整数Li,表示 阅读详情

这道题磨了我好久……

第一问可以二分出来,对于每个答案,贪心的分割,最后分割出来的段大于m+1的话就不行,这样的

第二问比较麻烦

有这样一个DP方程:

记前缀和为s

f[i][j]=sigma(f[i-1][k])(s[j]-s[k]<=limit)

f[i][j]表示把前j根木棍分割成i段的方案数

那么,暴力算的话复杂度是O(mn^2),TLE无疑

我一开始没有注意到题目性质,如果单看DP方程,是想不到什么好的方法的

经pty提醒发现,由于s这个函数是前缀和,因此k的最小值满足单调性,即随着j的递增,k的最小值单调不减

然后记g[i]为f[i]的前缀和函数,即g[i][j]=sigma(f[i][k])(k=1...j),f的值就等于两个g相减,可以O(1)求

这样对于每一维是线性的,复杂度优化至O(mn)

实际操作时不需要开二维,f也只能开滚动……


第一次提交:MLE,忘记开滚动……

第二次-第n次提交:wa,因为方便取模写了个inc函数,结果顺便把前缀和也取模了……

第n次-第m次提交:wa,贪心分割的过程写wa了……没计算最后一段……

我就是个傻×……不是学clj装B,是真正的那种……


//Lib
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<ctime>

#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<queue>
using namespace std;
//Macro
#define rep(i,a,b) for(int i=a,tt=b;i<=tt;++i)
#define drep(i,a,b) for(int i=a,tt=b;i>=tt;--i)
#define erep(i,e,x) for(int i=x;i;i=e[i].next)
#define irep(i,x) for(__typedef(x.begin()) i=x.begin();i!=x.end();i++)
#define read() (strtol(ipos,&ipos,10))
#define sqr(x) ((x)*(x))
#define pb push_back
#define PS system("pause");
typedef long long ll;
typedef pair<int,int> pii;
const int oo=~0U>>1;
const double inf=1e100;
const double eps=1e-6;
string name="",in=".in",out=".out";
//Var
const int mod=10007;
int n,m,ans,maxx;
int s[50008],a[50008];
int f[2][50008],g[50008],p[50008];
inline void inc(int &x,int y){x+=y;x%=mod;}
bool Check(int limit)
{
	int sum=0,cnt=0,i=1;
	rep(i,1,n)
	{
		sum+=a[i];
		if(sum>limit)cnt++,sum=a[i];
	}
	return cnt+1<=m;
}
int Calc()
{
	int l=maxx,r=s[n],mid;
	while(l<=r)
	{
		mid=l+r>>1;
		if(Check(mid))r=mid-1;
		else l=mid+1;
	}
	return l;
}
//f[i][j]表示i段j根
int Calc(int limit)
{
	int ret=0,now=0,pre,pos=0;
	f[0][0]=1;g[0]=1;
	rep(i,1,n){while(s[i]-s[pos]>limit)pos++;p[i]=pos;g[i]=1;}
	rep(i,1,m)
	{
		pre=now;now^=1;
		memset(f[now],0,sizeof f[now]);
		rep(j,1,n)
			inc(f[now][j],g[j-1]-g[p[j]]+f[pre][p[j]]);
		inc(ret,f[now][n]);g[0]=0;
		rep(j,1,n){g[j]=g[j-1]+f[now][j];}
	}
	return ret;
}
void Work()
{
	scanf("%d%d",&n,&m);m++;
	rep(i,1,n)scanf("%d",a+i),s[i]=s[i-1]+a[i],maxx=max(maxx,a[i]);
	ans=Calc();
	printf("%d %d\n",ans,Calc(ans));
}
int main()
{
//	freopen((name+in).c_str(),"r",stdin);
//	freopen((name+out).c_str(),"w",stdout);
	Work();
	return 0;
}


Kali Linux实战:5种局域网DoS攻击手法全解析(附防御方案) 本文以Kali Linux为平台,深入解析了局域网内五种典型的DoS攻击手法,包括TCP SYN Flood、ICMP Flood、MAC地址泛洪、DHCP耗尽以及应用层CC攻击模拟。通过实战演示结合Wireshark抓包分析,清晰揭示了攻击原理与流量特征,并提供了从主机加固、防火墙规则到交换机安全配置(如端口安全、DHCP Snooping)等企业级防御方案,旨在帮助安全人员构建纵深防御体系。 阅读详情

相关推荐

CST新手必看:共面波导色散曲线绘制全流程(附参数设置详解)

本文为CST新手提供了绘制共面波导色散曲线的完整流程与参数设置详解。从模型搭建、周期性边界条件设置,到本征模求解器配置和参数扫描技巧,逐步解析关键步骤,并分享后处理与结果验证方法,帮助用户高效完成仿真任务。

j0k1l2m3n的博客 422

木棒切割问题(***二分法)

木棒切割问题 给出N根木棒,长度均已知,现在希望通过切割它们来得到至少K段长度相等的木棒(长度必须是整数),问这些长度的木棒最长能有多长。 例如对三根长度分别为10,24,15 的木棒来说,假设 K = 7,即需要至少7段长度相等的木棒,那么可以得到的最大长度为6,在这种情况下,第一根木棒可以提供10/6 = 1段、第二根木棒可以提供24/6 = 4段、第三根木棒可以提供15/...

jiangjiangjiang6的博客 2836

华硕笔记本+Ubuntu 20.04:用cpupower解决Intel CPU频率上不去/功耗墙问题实战

本文详细介绍了在华硕笔记本Ubuntu 20.04系统下使用cpupower工具解决Intel CPU频率受限和功耗墙问题的实战方法。通过禁用Intel P-State驱动、配置userspace模式以及高级调优技巧,帮助用户突破性能瓶颈,提升编译和计算效率。

weixin_42561476的博客 524

木棒切割问题——算法笔记P134

我理解的作者的意思就是先找到最长的那根木棒,然后利用对这根木棒二分出来的长度L再对其他木棒求,然后总数相加就是k了,和目标值K进行比对。 left = 0,right = 最长木棒长度 求得的木棒个数k >= K,下限left = mid + 1; k< K ,上限 right = mid; #include<cstdio> #include<algorithm&...

qq_40595682的博客 1606

ESP32 Arduino学习篇 (一) 引脚和串口的基本使用

简单来讲arduino就是通过源代码控制开发板的信号输入输出从而实现对一些电子元件的控制,例如LED灯,蜂鸣器,按键arduino程序首先来讲arduino程序是基于C语言,而实现类似对于LED灯和蜂鸣器的简单控制只需简单C语言知识即可实现。arduino程序是基于函数的,而在arduino的库有很多函数,我们只需要调用即可。arduino的程序主体是**setup()函数和loop()**函数以及其它在使用过程中需要构建的函数:setup()函数。

DOF526570的博客 1万+

Unity中基于SkinMeshRenderer的骨骼动画换装系统优化实践

本文深入探讨了Unity中基于SkinnedMeshRenderer的骨骼动画换装系统优化实践。针对换装卡顿、显示错误等常见问题,文章剖析了SkinnedMeshRenderer的核心数据原理,对比了“数据替换”与“实体替换”两种主流方案的性能差异,并详细阐述了通过骨骼字典缓存、对象池管理、材质合并与Draw Call优化等实战技巧,构建高性能、高稳定性的生产级换装系统。

weixin_29008055的博客 314

Sticks<DFS>

题意: 给n个木棍,这些木棍是由m个长度均为L的木棍切割而来,求L的最小值。 思路: DFS+剪枝。 剪枝: 1:L的取值范围在n(max)和n(sum)之间,逐个枚举。sum%L!=0则L不能用。 2:sort对n个木棍长度进行由小到大排序,有以下好处: a:从大的开始搜索。eg:如果L8;5+3>(优势)5+2+1;把更灵活地木棍留...

weixin_30287169的博客 235

【AI智能体】最强AI编程利器 Claude Code 从部署到项目实战详解

最强AI编程利器 Claude Code 从部署到项目实战详解

congge 4511

算法基础题:木棍切割问题

本文章参考https://blog.youkuaiyun.com/qq_30432997/article/details/85283294 为下列问题设计一个动态规划算法。已知小木棍的销售价格pi和长度i相关,i=1,2,…,n,如何把长度为n的木棍切割为若干根长度为整数的小木棍,使得所获得的总销售价格最大?该算法的时间效率和空间效率各是多少? 长度为n的最大价值 price(n)=MAX(price(i)+...

cometo_bowl的博客 5867

手把手教你 Ubuntu 24.04 离线安装 Ollama

本文介绍 Ubuntu 下离线安装 Ollama 并使用 Ollama 部署 llama3.1-70b 大模型

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 1018

MATLAB - 机械臂手眼标定(眼在手内) - 估计安装在机器人上的移动相机的姿态

执行手眼校准有助于操作配备末端执行器(简称 “手”)的机械臂,该末端执行器依赖于摄像头提供的视觉数据。一旦完成了眼在手外的校准,机械臂就能准确地移动到摄像头识别的特定像素位置。这种能力是执行精确拾放任务(如分类、堆垛和分拣)的基础,即使在摄像机的确切位置和方向未知的情况下也是如此。机器人-摄像机系统有两种构型:眼在手内和眼在手外。在眼在手内构型中,摄像头直接安装在机器人手臂的末端执行器上。相反,在眼在手的构型中,摄像头固定在一个静止的物体上,机器人手臂在其视野内。

机器人控制与仿真应用 3348

【BZOJ 1044】木棍分割

1.题目链接。首先第一问,由于木棍的长度都是非负数,所以前缀和单调不减,这样直接二分这个maxLen就可以得到答案。然后第二问,设dp[i][j]表示把对于前i个,切了j刀满足要求的方案数。这样,dp[i][j]的转移其实很好推: 然后,这里开始优化: (1)首先是空间优化,...

YG爱木木 476

Sigrity Power DC Package Multi-Resistor Compact ET Model Extraction模式提取封装基板电热阻模型

DIE(定义DIE的参数):material设置为silicon(硅),Attach material(贴片的材料,设置为Die Attach),Attach thickness(贴片的材料的厚度,厚度设置为0.001mm,点击ok。Cap为覆盖材料,Material定义材料类型,thickness定义厚度,length和width定义长宽,Adhesive Material为胶的材料,Adhesive Material为胶的厚度,本例不定义,跳过即可。

weixin_54787054的博客 438

题解 - [HAOI2008]木棍分割

[HAOI2008]\mathrm{[HAOI2008]}[HAOI2008] 木棍分割 吐槽环节 为什么一分部分分不给啊,一开始写了个n3n^3n3,居然直接爆蛋。 前缀和优化DPDPDP还要滚存 题目意思 题目传送门 Sol\mathrm{Sol}Sol 前置知识:前缀和优化DP 对于第一问就是个hhhhhh问题,直接二分就可以了。这个没什么好讲,看看代码: inline bool...

wangyiyang2的博客 277

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

BZOJ 1044 HAOI2008 木棍分割

1044: [HAOI2008]木棍分割 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 4241 Solved: 1627 [Submit][Status][Discuss] Description   有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个...

186

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【BZOJ1044】[HAOI2008]木棍分割

【BZOJ1044】[HAOI2008]木棍分割 题面 bzoj 洛谷 题解 第一问显然可以二分出来的。 第二问: 设\(dp[i][j]\)表示前\(i\)个,切了\(j\)组的方案数 发现每次转移都是从前面一个区间过来的 直接前缀和优化就好了 代码 #include <iostream> #include <cstdio> #include <cstdl...

210

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

BZOJ1044 [HAOI2008]木棍分割 【二分+Dp】

1044: [HAOI2008]木棍分割 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 4281  Solved: 1644 [Submit][Status][Discuss] Description   有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连 接处, 砍完

Mychael的无声乐章 316

1044: [HAOI2008]木棍分割 题解

BZOJ 1044: [HAOI2008]木棍分割 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要

SKY的C 2125

【bzoj1044】【HAOI2008】【木棍分割】

1044: [HAOI2008]木棍分割Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2018 Solved: 730 [Submit][Status][Discuss] Description有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段

Vampire 1692

BZOJ 1044: [HAOI2008]木棍分割 二分 dp

1044: [HAOI2008]木棍分割 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 3883  Solved: 1492 [Submit][Status][Discuss] Description   有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n

BlackJack 352

[BZOJ1044][HAOI2008]木棍分割

1044: [HAOI2008]木棍分割 Time Limit: 10 SecMemory Limit: 162 MB Submit: 3998Solved: 1537 [Submit][Status][Discuss] Description   有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连 接处, 砍完后...

weixin_30558305的博客 82

BZOJ 1044 HAOI 2008 木棍分割 二分 贪心 动态规划

真是心烦。。似乎一个sb用脚本拼命交30s的while(1)程序卡评测。。这种缺智商的大抵也就会卡oj了。明明有80s的250s的去卡30s的第一问 二分贪心即可得到答案max_cut。 第二问 令f[i][j]f[i][j]表示前i根切j次的方案数。那么显然有 f[i][j]=∑f[k][j−1](a[k+1]+⋯+a[i]≤max_cut)f[i][j]=\sum f[k][j-1](a[k

とある黄鱼のOIブログ 775

P2511 [HAOI2008]木棍分割(二分,动态规划)

P2511 [HAOI2008]木棍分割 题目大意 有nnn根木棍, 第iii根木棍的长度为LeniLen_iLeni​,nnn根木棍依次连结了一起, 总共有n−1n-1n−1个连接处. 现在允许你最多砍断mmm个连接处, 砍完后nnn根木棍被分成了很多段,要求满足总长度最大的一段长度最小, 并且输出有多少种砍的方法使得总长度最大的一段长度最小. 题目分析 总长度最大的一段最小:最大值最小问题,可...

仙都一普通市民的blog 682

bzoj.1044: [HAOI2008]木棍分割

1044: [HAOI2008]木棍分割 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 3311  Solved: 1249 [Submit][Status][Discuss] Description   有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连 接处, 砍完

cx_lzx蒟蒻的博客 202
上一篇: [JSOI2007]文本生成器
下一篇: 无语……root的小幽默
OrpineX
博客等级 码龄17年 16粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值