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

相关文章

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

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