首页 > 其他分享 >BZOJ5424 烧桥计划(单调队列优化dp)

BZOJ5424 烧桥计划(单调队列优化dp)

时间:2024-04-29 17:35:21浏览次数:29  
标签:BZOJ5424 int lst while maxk 烧桥 include dp

传送门(vjudge)

解题思路

注意到 \(a_i\) 的范围很小,是1000~2000之间,于是我们可以直观感受到k一定不会特别大,推一下可以得出 k 最多大概在四五百左右,于是可以直接考虑 dp[i][j] 为前 i 个数里面选了 j 个分割点,且第 i 个数是分割点的最小代价。

转移要分两种情况讨论:

  • sum[pre+1~i-1] 大于 m
  • sum[pre+1~i-1] 小于等于 m

可以用类似双指针的东西来维护这个分割点。
随着 i 的增大,分割点右移,会有第二种情况的点变成第一种情况。
第一种情况的点集可以只维护一个min值,不断更新即可。
第二种情况的点集一开始用想用优先队列加个log梭哈过去,结果发现90分,很难受,只能被迫改成单调队列qwq(比较明显,要是pre比你靠后并且dp值还比你小,那你就可以退役了)

AC代码

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<iomanip>
#include<ctime>
#include<stack>
using namespace std;
inline int read(){
	int x=0,f=1;char c=getchar();
	while((c<'0'||c>'9')) {if(c=='-') f=-1;c=getchar();}
	while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
	return x*f;
}
#define pii pair<int,int>
#define mp(a,b) make_pair(-a,b)
#define fi first
#define se second
const int maxk=305;
const int maxn=1e5+5;
deque<int> q[maxk];
int dp[maxn][maxk];
int l[maxk],a[maxn],d[maxn],minn[maxk];
int main(){
	int T=1;
	while(T--){
		int n=read(),m=read();
		for(int i=1;i<=n;i++){
			a[i]=read();
			d[i]=d[i-1]+a[i];
		}
		memset(l,0,sizeof(l));
		memset(minn,0,sizeof(minn));
		memset(dp,0x3f,sizeof(dp));
		dp[0][0]=0;
		for(int i=0;i<=300;i++) while(!q[i].empty()) q[i].pop_front();
		q[0].push_back(0);
		for(int i=1;i<=n;i++){
			for(int j=min(i,300);j>=2;j--){
				int lst=j-1;
				while(d[i-1]-d[l[lst]]>m){
					l[lst]++;
					if(dp[minn[lst]][lst]+d[i-1]-d[minn[lst]]>dp[l[lst]][lst]+d[i-1]-d[l[lst]]) minn[lst]=l[lst];
				}
				while(!q[lst].empty()&&q[lst].front()<l[lst]){
					q[lst].pop_front();
				}
				int res=dp[minn[lst]][lst]+d[i-1]-d[minn[lst]];
				if(!q[lst].empty()){
					res=min(res,dp[q[lst].front()][lst]);
				}
				dp[i][j]=res+j*a[i];
				while(!q[j].empty()&&dp[i][j]<dp[q[j].back()][j]) q[j].pop_back();
				q[j].push_back(i);
			}
			dp[i][0]=(d[i]>m?d[i]:0);
			dp[i][1]=(d[i-1]>m?d[i-1]:0)+a[i];
			while(!q[1].empty()&&dp[i][1]<dp[q[1].back()][1]) q[1].pop_back();
			q[1].push_back(i);
		}
		int ans=(d[n]>m?d[n]:0);
		for(int i=1;i<=n;i++){
			for(int j=1;j<=min(i,300);j++){
				ans=min(ans,dp[i][j]+(d[n]-d[i]>m?d[n]-d[i]:0));
			}
		}
		printf("%d\n",ans);
	} 
	return 0;
}

标签:BZOJ5424,int,lst,while,maxk,烧桥,include,dp
From: https://www.cnblogs.com/yinyuqin/p/18166324

相关文章

  • oracle数据导入导出,备份还原命令expdp&impdp(只导出元数据,不导出表数据,最全,最完善的步
    感谢金龙鱼先生分享,原文来自https://blog.csdn.net/kou869929526/article/details/125791113一,编码要求以及数据库版本要求检查数据库版本(用于决定导出时生成为哪个版本的dmp头文件)selectversionfromv$instance;检查字符集是否一致(字符集不一致,不能导入)selectuserenv(......
  • Surface Pro 4 miniDP转接HDMI 4K显示的问题
    1、我在某东上买了一个支持4k的minidp转hdmi的转接头,可以支持2K显示器。不过直接连接的话2K显示器最高只能设置1080P的分辨率。解决方法:可以先单独让2k显示器显示,设置分辨率为2k,然后再扩展显示,就可以完美使用了,希望有帮助。2、SurfacePro4及其扩展坞上的MiniDisplayPort能否......
  • hdp2.4 -- hbase集群replication
    liststatuslist_namespace list_peers,list_replicated_tables主节点create'replication_test','f1','f2'1hbase(main):011:0>put'replication_test','rk0001','f1:name','zhanzongxin1'......
  • hdp2.4搭建
    http://192.168.159.11/hbase/虚拟机目录/var/www/html/hbase启动httpd  /bin/systemctlstarthttpd.service  httpd配置文件修改下面三行路径   vi/etc/httpd/conf/httpd.confDocumentRoot"/data/www/html"<Directory"/data/www"><Directory"/d......
  • P5896 [IOI2016] aliens (斜率优化 dp+wqs 二分)
    我们可以把所有点都对称到主对角线下方。然后每个点如果想被覆盖都会有一个最小的三角形,我们可以贪心的只留必须选的点。如果把剩下的点按\(x\)坐标升序排序,可以发现他们的\(y\)坐标也是升序排序的。记剩余点个数为\(n\),显然每个点都选自己的最小三角形最好。但是有可能\(......
  • WordPress操作文章类常用的动作钩子
    publish_post:参数一个($post_ID),点击发布文章时就会被触发;save_post:参数一个($post_ID),发布或更新文章时就会被触发;edit_post:参数两个($post_ID,$post),只要编辑已经存在的文章就会被触发;publish_future_post:参数一个($post_ID),到定时发布文章设定的时间点就会被触发,如果设定的时间早于......
  • 使用 WordPress搭建一个个人博客
    安装LNMP首先需要下载LNMP:wgethttp://soft.vpser.net/lnmp/lnmp2.0.tar.gz-cOlnmp2.0.tar.gz下载完成后解压并执行:tarzxflnmp2.0.tar.gz&&cdlnmp1.5&&./install.shlnmp选择想要安装的版本然后回车开始安装,这里时间比较长,耐心等待一下,看到以下显示表示安装成功配......
  • Winform程序使用app.minifest清单禁止高DPI无法失效问题
    问题:Winform程序使用app.minifest清单禁止高DPI无法失效问题摘要:因为笔记本基本都会有DPI放大,所以目前程序需要嵌入清单,并将其高DPI支持给禁止掉。环境搭建:Winform、app.minifest由于我的程序是使用CreateProcessAsUser来启动Winform,所以一开始以为是有权限问题。也有在群里跟......
  • SystemVerilog -- 6.3 Interface ~ Modports
    在接口中定义带有方向的modport列表,以对模块内的接口访问施加某些限制。关键字指示方向的声明方式与模块内部一样。Syntaxmodport[identifer](input[port_list],output[port_list]);下面显示的是接口myInterface的定义,它有几个信号和两个声明。modportdut0本......
  • 单调队列优化DP
    单调队列优化dp单调队列可以求某固定区间的最值,所以dp中需要求某固定区间的最值则可以考虑使用单调队列优化单调队列-滑动窗口https://www.luogu.com.cn/problem/P1886/**@Author:Danc1ng*@Date:2024-04-2416:06:34*@FilePath:P1886滑动窗口[模......