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

相关文章

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <

遮罩,在指定元素上进行遮罩

废话不多说,直接上代码: ps:依赖 jquer.js 1.首先,定义一个 Overlay.js  代码如下: /*遮罩 Overlay js 对象*/function Overlay(options){//{targetId:'',viewHtml:'',viewWidth:'',viewHeight:''}try{this.state=false;//遮罩状态 true 激活,f

学习记录:js算法(二十八):删除排序链表中的重复元素、删除排序链表中的重复元素II

文章目录 删除排序链表中的重复元素我的思路解法一:循环解法二:递归 网上思路 删除排序链表中的重复元素 II我的思路网上思路 总结 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 图一 图二 示例 1:(图一)输入:head = [1,1,2]输出:[1,2]示例 2:(图

linux 下Time_wait过多问题解决

转自:http://blog.csdn.net/jaylong35/article/details/6605077 问题起因: 自己开发了一个服务器和客户端,通过短连接的方式来进行通讯,由于过于频繁的创建连接,导致系统连接数量被占用,不能及时释放。看了一下18888,当时吓到了。 现象: 1、外部机器不能正常连接SSH 2、内向外不能够正常的ping通过,域名也不能正常解析。

Java基础回顾系列-第六天-Java集合

Java基础回顾系列-第六天-Java集合 集合概述数组的弊端集合框架的优点Java集合关系图集合框架体系图java.util.Collection接口 List集合java.util.List接口java.util.ArrayListjava.util.LinkedListjava.util.Vector Set集合java.util.Set接口java.util.HashSetjava

【408数据结构】散列 (哈希)知识点集合复习考点题目

苏泽  “弃工从研”的路上很孤独,于是我记下了些许笔记相伴,希望能够帮助到大家    知识点 1. 散列查找 散列查找是一种高效的查找方法,它通过散列函数将关键字映射到数组的一个位置,从而实现快速查找。这种方法的时间复杂度平均为(

JS和jQuery获取节点的兄弟,父级,子级元素

原文转自http://blog.csdn.net/duanshuyong/article/details/7562423 先说一下JS的获取方法,其要比JQUERY的方法麻烦很多,后面以JQUERY的方法作对比。 JS的方法会比JQUERY麻烦很多,主要则是因为FF浏览器,FF浏览器会把你的换行也当最DOM元素。 <div id="test"><div></div><div></div

力扣第347题 前K个高频元素

前言 记录一下刷题历程 力扣第347题 前K个高频元素 前K个高频元素 原题目: 分析 我们首先使用哈希表来统计数字出现的频率,然后我们使用一个桶排序。我们首先定义一个长度为n+1的数组,对于下图这个示例就是长度为7的数组。为什么需要一个长度为n+1的数组呢?假如说总共有三个数字都为1,那么我们需要把这个1放在数组下标为3的位置,假如说数组长度为n,对于这个例子就是长度为3,那么它的

python内置模块datetime.time类详细介绍

​​​​​​​Python的datetime模块是一个强大的日期和时间处理库,它提供了多个类来处理日期和时间。主要包括几个功能类datetime.date、datetime.time、datetime.datetime、datetime.timedelta,datetime.timezone等。 ----------动动小手,非常感谢各位的点赞收藏和关注。----------- 使用datet

java集合的概述

集合就是一个容器,我们可以把多个对象放入的容器中。就像水杯(假设容量可以不断扩大)一样,你可以往水杯中不断地添加水,既然是水杯,你就不能往里添加沙子,也就是说集合中添加的对象必须是同一个类型的(引用类型,而不能是基本类型)。 看到集合的介绍会让我们的想起数组,那么集合和数组有什么区别呢? 首先,数组的大小是固定的,而集合理论上大小是不限的。 其次,数组既可以存储基本数据类型的数据,也可以存储