首页 > 其他分享 >最长不下降子序列

最长不下降子序列

时间:2023-03-01 18:11:05浏览次数:47  
标签:cha int max mid 下降 ans 序列 buidtree 最长

 

 

思路:利用线段树求出 a[i] (以 下表i所在数为结尾的最长不下降序列), 然后刷新线段树,从大到小 重新放入线段树 ,求出 区间 (i+k+1~n)之间 最大的不下降子序列。 代码
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e7+9;
int e[N],a[N],lazy[N];
int b[N],c[N]; 
int aa[N],bb[N];
void buidtree(int k,int l,int r)
{
	if(l==r)
	{
		e[k]=0;
		return ;
	}
	int mid=(l+r)>>1;
	buidtree(k<<1,l,mid);
	buidtree(k<<1|1,mid+1,r);
	e[k]=max(e[k<<1],e[k<<1|1]);
	return ;
}
void push(int k,int l,int r,int w,int y)
{
	if(l==r)
	{
		e[k]=y;
		return ;
	}
	int mid=(l+r)>>1;
	if(mid<w)
	{
		push(k<<1|1,mid+1,r,w,y);	
	}
	else 	push(k<<1,l,mid,w,y);
	e[k]=max(e[k<<1],e[k<<1|1]);
	return ;
}
int cha(int k,int l,int r,int x,int y)
{
	if(x<=l&&y>=r)
	{
		return e[k];
	}
	int mid=(l+r)>>1;
	int ans=0;
	if(mid>=x)
	{
		ans=max(ans,cha(k<<1,l,mid,x,y));
	}
	if(y>mid)
	{
		ans=max(ans,cha(k<<1|1,mid+1,r,x,y));
	}
	return ans;
}
struct node
{
	int x,y;
}p[N];
bool cam(node x,node y)
{
	if(x.x!=y.x)
	return x.x<y.x;
	return x.y<y.y; 
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	int n,d,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>d;
		c[i]=d;
		p[i].x=d;
		p[i].y=i;
	}
	
	buidtree(1,1,n);
	sort(p+1,p+1+n,cam);
	for(int i=1;i<=n;i++)
	{
		int x=p[i].y;
		int y=p[i].x;
		y=cha(1,1,n,1,x)+1;
		a[x]=y;
		push(1,1,n,x,y);
	}
	int ans=0,j=n;
	buidtree(1,1,n);
	for(int i=0;i<=n*5;i++)
	{
		e[i]=0;
	}
	for(int i=n;i>=1;--i)
	{
		
		int x=p[i].y;
		int y=p[i].x;
		int s=x+m+1;
		if(s>n)
		{
			ans=max(ans,a[x]+n-x);
		}
		else
		{
			ans=max(ans,a[x]+m+cha(1,1,n,s,n));
		}
		y=cha(1,1,n,x,n)+1;
		push(1,1,n,x,y);
	//	b[x]=y;
		j--;
	}
	cout<<ans;
	return 0;
}
********

标签:cha,int,max,mid,下降,ans,序列,buidtree,最长
From: https://www.cnblogs.com/xxj112/p/17169243.html

相关文章

  • 机器学习(一):混淆矩阵与最优化方法习题(二元函数最小值 梯度下降法 手推+代码实现)
    机器学习第一次作业若样本的预测标签和真实标签如下:请给出Acc,Precision和Recall[预测标签,真实标签][1,1],[1,0],[1,1],[0,1],[1,0],[1,1],[......
  • 梯度下降,损失函数,模型训练
    我发现这种数学问题,国内的教材,就会给你整的罗里吧嗦,说不清楚,让人非常难理解损失函数(lossfunction)或代价函数(costfunction)是将随机事件或其有关随机变量的取值映射为非负......
  • LeetCode算法训练-贪心算法 455.分发饼干 376. 摆动序列 53. 最大子序和
    欢迎关注个人公众号:爱喝可可牛奶LeetCode算法训练-贪心算法455.分发饼干376.摆动序列53.最大子序和前置知识贪心算法核心是找局部最优解,通过局部最优推导出全局最......
  • 反序列化刷题
    反序列化魔法函数:(以俩个下划线开头的方法称为魔法函数)__construct()   在创建对象时候初始化对象,一般用于对变量赋初值。创建一个新的类时,自动调用该方法__destruct(......
  • python用线性回归预测时间序列股票价格|附代码数据
    原文参考:http://tecdat.cn/?p=4516最近我们被客户要求撰写关于线性回归预测股票价格的研究报告,包括一些图形和统计输出。线性回归在整个财务中广泛应用于众多应用程序中......
  • BZOJ 2870 最长道路
    BZOJ2870最长道路题意给定一棵\(n\)个节点的树,求树上一条链,使得链的长度乘链上所有点中最小权值所得的积最大\(n\le5\times10^4\)链长度是链上点的个数题面做......
  • 524. 通过删除字母匹配到字典里最长单词 (Medium)
    问题描述524.通过删除字母匹配到字典里最长单词(Medium)给你一个字符串s和一个字符串数组dictionary,找出并返回dictionary中最长的字符串,该字符串可以通过删除s......
  • 课堂练习01题目:计算最长英语单词链总结
     一、题目内容:大家经常玩成语接龙游戏,我们试一试英语的接龙吧:一个文本文件中有N个不同的英语单词,我们能否写一个程序,快速找出最长的能首尾相连的英语单词链,每个单词......
  • 1218.最长定差子序列 (Medium)
    问题描述1218.最长定差子序列(Medium)给你一个整数数组arr和一个整数difference,请你找出并返回arr中最长等差子序列的长度,该子序列中相邻元素之间的差等于differ......
  • 334. 递增的三元子序列 (Medium)
    问题描述334.递增的三元子序列(Medium)给你一个整数数组nums,判断这个数组中是否存在长度为3的递增子序列。如果存在这样的三元组下标(i,j,k)且满足i<j<k......