首页 > 其他分享 >裁剪序列Cut the Sequence

裁剪序列Cut the Sequence

时间:2024-06-08 16:32:45浏览次数:22  
标签:Cut Sequence int 裁剪 pos 队列 front 单调 define

image
首先,我们可以先想一想朴素算法,推出DP,i表示分了几段,则可以推出$$F[i]=min_{1<=j<=i}(f[j]+max_{j+1<=k<=i}(a[k]))$$

点击查看代码
	memset(f,0x3f,sizeof f);
	f[0]=0;
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<i;j++)
		{
			int tmp=0;ll sum=0;
			for(int k=j+1;k<=i;k++)
			{
				tmp=max<ll>(tmp,a[k]);
				sum+=a[k];
			}
			if(sum<=m)f[i]=min(f[i],f[j]+tmp);
		}
	}
	cout<<f[n];

这是\(O(n^2)\)的算法复杂度,如何优化,我们可以想到用双端队列维护\(a\)数组,以单调递减趋势
用一个变量\(pos\)控制他的左边界别超出\(m\),如何维护最优值呢?
显然\(F[i]\)成一个单调递增趋势,一个区间\(a\)的值越大,他包含的范围应该越大,当max(a[j+1—>i])的值固定,那么j越小越好,当不固定时,可以排除一些情况,即$$j1<j2 a[j1]<=a[j2]是无用的$$
这是我们可以看出用单调队列维护由于f[j]+max(a[j+1—>i])不单调,要用multiset维护一下
与单调队列同步,具体详细看代码
\(F[i]=f[pos-1]+a[q.front()]\)

点击查看代码
#include <bits/stdc++.h>
#define ll long long
#define mk make_pair 
#define pb push_back
#define lid (rt<<1)
#define rid (rt<<1|1)
#define speed() ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
const int N = 1e5+5;
ll n,m,a[N],f[N];
multiset <ll> s;
deque <ll> q;
int main()
{
	speed();
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];if(a[i]>m)return cout<<-1,0;
	}
	deque <int> q;
	int ans=0,pos=1;
	for(int i=1;i<=n;i++)
	{
		ans+=a[i];
		while(ans>m)ans-=a[pos++];	//边界
		while(q.size()&&q.front()<pos)
		{
			ll tp=f[q.front()];
			q.pop_front();//因为单调队列单调递减的缘故,所以front后一个就是max
			if(q.size())s.erase(tp+a[q.front()]);//同步
		}
		while(q.size()&&a[q.back()]<=a[i])
		{
			ll tp=a[q.back()];
			q.pop_back();
			if(q.size())s.erase(tp+f[q.back()]);
		}
		if(q.size())s.insert(a[i]+f[q.back()]);//队列中每两个相邻元素就得insert一次
		q.push_back(i);
		f[i]=f[pos-1]+a[q.front()];//一种可能情况,选择pos->i整个区间,因为该段区间最大值(a[q.front()])与f[k-1]也构成一对可能解
		if(s.size())f[i]=min<ll>(f[i],*s.begin());
		
	}
	cout<<f[n];
	return 0;
 } 

标签:Cut,Sequence,int,裁剪,pos,队列,front,单调,define
From: https://www.cnblogs.com/wlesq/p/18238578

相关文章

  • jQWidgets 19.2.0 Visualize Sequences
    jQWidgets19.2.0VisualizeSequencesjQWidgets19.2.0addsanewcomponentforvisualizingchronologicaldatawithsupportforinteractivescrolling,customizablestyles,andrichcontent.jQWidgetsisacomprehensiveJavaScriptUIframeworkofferi......
  • AutoCutVideo自动剪辑软件
    随着视频内容创作的普及,找到一款既高效又便捷的视频剪辑工具成为了创作者的迫切需求。在众多选择中,AutoCutVideo以其杰出的功能脱颖而出,提供了一个无与伦比的视频编辑解决方案。这款软件不仅能够支持多样化的视频格式导入,其直观的操作界面和强大的视频处理能力更是赢得了大......
  • 题解:ABC270G Sequence in mod P
    题目传送门思路题目给出了一个数列\[x_{i+1}\equiv{a\timesx_i+b}\pmod{p}\]并想要求最小的\(x_i=G\),那我们可以考虑求出这个数列的通项公式。具体的,观察到原式可以转化成一个等比数列的形式,所以我们可以先设一个常数\(k\),使得\[x_{i+1}+k=a(x_i+k)\]替换进原先的式子......
  • 如何创建一个线程池,为什么不推荐使用Executors去创建呢?
    我们在学线程的时候了解了几种创建线程的方式,比如继承Thread类,实现Runnable接口、Callable接口等,那对于线程池的使用,也需要去创建它,在这里我们提供2种构造线程池的方法:方法一:通过ThreadPoolExecutor构造函数来创建(首选)  这是JDK中最核心的线程池工具类,在JDK1.8中,它提供了丰......
  • GCD-sequence(Round 950)
    #include<bits/stdc++.h>#defineendl'\n'usingll=longlong;typedefunsignedlonglongull;usingnamespacestd;voidGordenGhost();signedmain(){#ifdefGordenfreopen("in.txt","rt",stdin);freopen......
  • 裁剪的3种方式,CSS 如何隐藏移动端的滚动条?
    在移动端开发中,经常会碰到需要横向滚动的场景,例如这样的但很多时候是不需要展示这个滚动条的,也就是这样的效果,如下你可能想到直接设置滚动条样式就可以了,就像这样::-webkit-scrollbar{display:none;}目前来看好像没什么问题,但在某些版本的iOS上却无效(具体待测试),滚......
  • Python并发 :ThreadPoolExecutor
    concurrent.futures是Python中执行异步编程的重要工具,它提供了以下两个类: 1.ThreadPoolExecutorfromconcurrent.futuresimportThreadPoolExecutordeftest(num):print("Threads"num)#新建ThreadPoolExecutor对象并指定最大的线程数量withThreadPoolExecutor(......
  • [pg]指定 schema 下所有用户或角色对 sequence
    在PostgreSQL中可以使用以下查询来获取指定schema下所有用户或角色对sequence的权限详细信息:查询指定schema下所有用户对sequence的权限:SELECTpg_catalog.pg_get_userbyid(g.grantee)ASgrantee,c.relnameASsequence_name,array_to_string(array......
  • Dated Data: Tracing Knowledge Cutoffs in Large Language Models
    本文是LLM系列文章,针对《DatedData:TracingKnowledgeCutoffsinLargeLanguageModels》的翻译。日期数据:追踪大型语言模型中的知识截断摘要1引言2相关工作3方法4结果5为什么模型与截止日期不一致?6结论摘要已发布的大型语言模型(LLM)通常与声称的......
  • allure的suites(测试套)中未显示返回值参数,显示No information about test execution is
    转自大佬:https://blog.csdn.net/sbdxmnz/article/details/137016423 ExecutionNoinformationabouttestexecutionisavailable.  解决方法:添加代码,因为pytest输出文本形式测试报告时未存储响应内容#将接口响应的文本内容附加到Allure报告中allure.attach(接口响......