Nonsense Time(LIS元素集合求解)

2023-12-31 22:40

本文主要是介绍Nonsense Time(LIS元素集合求解),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原题: http://acm.hdu.edu.cn/showproblem.php?pid=6635

题意:

给出一个排序,当前所有数字不能使用。给出可以使用的顺序,求每次加入新的可以使用的数字后的最长上升子序列长度。

解析:

我们考虑从后往前找,把加入改为删除。因为数据随机,所以删除序列内元素的期望为 O ( l o g N ) O(logN) O(logN)。所以我们可以暴力去做,如果删除的元素在序列里面就重新做。

维护栈内元素的过程大致如下:
在这里插入图片描述
从最后一个扩栈的元素往回回溯就是答案。

代码:

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
const int maxn=5e4+9;
int a[maxn],p[maxn];
bool cut[maxn];
bool in[maxn];int ar[maxn],top;
int pre[maxn];int deal(int n){memset(in,0,sizeof in);top=0;int En;for(int i=1;i<=n;i++){if(cut[a[i]])continue;if(top==0)ar[top=1]=a[i],pre[a[i]]=0,En=a[i];else if(a[i]>ar[top]){ar[++top]=a[i];pre[a[i]]=ar[top-1];En=a[i];}else{int pos=lower_bound(ar+1,ar+1+top,a[i])-ar;ar[pos]=a[i];pre[a[i]]=ar[pos-1];}}while(En){in[En]=1;En=pre[En];}return top;
}int main(){int t;scanf("%d",&t);while(t--){memset(cut,0,sizeof cut);int n;scanf("%d",&n);rep(i,1,n){scanf("%d",a+i);}rep(i,1,n){scanf("%d",p+i);}int len=deal(n);vector<int>V(n+1);V[n]=len;per(i,n,2){cut[a[p[i]]]=1;if(in[a[p[i]]]){len=deal(n);}V[i-1]=len;}rep(i,1,n){printf("%d%c",V[i]," \n"[i==n]);}}
}

这篇关于Nonsense Time(LIS元素集合求解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/557335

相关文章

CSS实现元素撑满剩余空间的五种方法

《CSS实现元素撑满剩余空间的五种方法》在日常开发中,我们经常需要让某个元素占据容器的剩余空间,本文将介绍5种不同的方法来实现这个需求,并分析各种方法的优缺点,感兴趣的朋友一起看看吧... css实现元素撑满剩余空间的5种方法 在日常开发中,我们经常需要让某个元素占据容器的剩余空间。这是一个常见的布局需求

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

如何高效移除C++关联容器中的元素

《如何高效移除C++关联容器中的元素》关联容器和顺序容器有着很大不同,关联容器中的元素是按照关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的,本文介绍了如何高效移除C+... 目录一、简介二、移除给定位置的元素三、移除与特定键值等价的元素四、移除满足特android定条件的元

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

python中time模块的常用方法及应用详解

《python中time模块的常用方法及应用详解》在Python开发中,时间处理是绕不开的刚需场景,从性能计时到定时任务,从日志记录到数据同步,时间模块始终是开发者最得力的工具之一,本文将通过真实案例... 目录一、时间基石:time.time()典型场景:程序性能分析进阶技巧:结合上下文管理器实现自动计时

Python容器类型之列表/字典/元组/集合方式

《Python容器类型之列表/字典/元组/集合方式》:本文主要介绍Python容器类型之列表/字典/元组/集合方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 列表(List) - 有序可变序列1.1 基本特性1.2 核心操作1.3 应用场景2. 字典(D

Java集合中的List超详细讲解

《Java集合中的List超详细讲解》本文详细介绍了Java集合框架中的List接口,包括其在集合中的位置、继承体系、常用操作和代码示例,以及不同实现类(如ArrayList、LinkedList和V... 目录一,List的继承体系二,List的常用操作及代码示例1,创建List实例2,增加元素3,访问元