[BZOJ 3173] [TJOI 2013] 最长上升子序列(fhq treap)

题面

给定一个序列,初始为空。现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置。每插入一个数字,我们都想知道此时最长上升子序列长度是多少?

分析

这题有几个重要性质:

第一个性质是,插入的数的大小是递增的。我们插入第i个数后的答案,为以当前序列中的数为结尾的LIS长度的最大值,而根据当前序列中的数都在[1,i]内,们可以维护以值v为结尾的LIS长度len[i],那么第i次插入后的答案就是\(max(len[j]) (j \in [1,i])\)

第二个性质是,后插入的数不会影响以前面插入的数为结尾的LIS长度。这句话有点抽象,我们来举一个例子。插入完两个数后的序列是{1,2},以2结尾的LIS长度为2。然后我们在2前面插入3,序列变成了{1,3,2},因为3>2,它不会影响以2结尾的LIS长度,因此以2结尾的LIS长度仍为2。如果插入在2后面,显然新的LIS结尾不可能是2,对以2结尾的LIS长度没有影响。

因此,我们只要用一个数据结构处理出插入n次后的最终序列,对这个序列跑一次LIS,求出以v结尾的序列长度,然后前缀max一下求出答案。这里我选择了fhq treap来维护序列,然后用模板的\(O(n \log n)\)求LIS算法。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define maxn 100000
using namespace std;
struct fhq_treap{
#define lson(x) tree[x].ls
#define rson(x) tree[x].rs
struct node{
int ls;
int rs;
int val;
int sz;
int dat;
}tree[maxn+5];
int root;
int ptr;
int New(int val){
ptr++;
tree[ptr].val=val;
tree[ptr].dat=rand();
tree[ptr].sz=1;
return ptr;
}
void push_up(int x){
tree[x].sz=tree[lson(x)].sz+tree[rson(x)].sz+1;
}
int merge(int x,int y){
if(!x||!y) return x+y;
if(tree[x].dat<tree[y].dat){
tree[y].ls=merge(x,tree[y].ls);
push_up(y);
return y;
}else{
tree[x].rs=merge(tree[x].rs,y);
push_up(x);
return x;
}
}
void split(int now,int k,int &x,int &y){
if(now==0){
x=y=0;
return;
}
if(k<=tree[lson(now)].sz){
y=now;
split(tree[now].ls,k,x,tree[y].ls);
}else{
x=now;
split(tree[now].rs,k-tree[lson(now)].sz-1,tree[x].rs,y);
}
push_up(now);
}
void insert(int val,int pos){
int x,y;
split(root,pos-1,x,y);
root=merge(merge(x,New(val)),y);
}
void print(int x,int *out,int &sz){
if(x==0) return;
print(lson(x),out,sz);
out[++sz]=tree[x].val;
print(rson(x),out,sz);
}
}T; int n;
int sz=0;
int a[maxn+5]; int top=0;
int s[maxn+5];
int len[maxn+5];//以值i为结尾的LIS长度
void get_lis(){
for(int i=1;i<=n;i++){
if(a[i]>s[top]){
s[++top]=a[i];
len[a[i]]=top;
}else{
int tmp=lower_bound(s+1,s+1+top,a[i])-s;
s[tmp]=a[i];
len[a[i]]=tmp;
}
}
}
int main(){
int x;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&x);
x++;
T.insert(i,x);
}
T.print(T.root,a,sz);
// for(int i=1;i<=sz;i++) printf("%d ",a[i]);
get_lis();
int ans=0;
for(int i=1;i<=n;i++){
ans=max(ans,len[i]);
printf("%d\n",ans);
//第i个数插入的时候,序列里只有1~i的数,把以它们为结尾的lis长度取max即可
}
}

[BZOJ 3173] [TJOI 2013] 最长上升子序列(fhq treap)的更多相关文章

  1. 【bzoj 3173】[Tjoi2013]最长上升子序列

    Description 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数字,我们都想知道此时最长上升子序列长度是多少? Input 第一行一 ...

  2. [TJOI]2013 最长上升子序列

    这个题据说是Splay,或者说是平衡树的模板题,但是我还是不会做--唉-- \(\color{red}{Description}\) 给定一个序列,初始为空.现在我们将\(1\)到\(N\)的数字插入 ...

  3. 2021.12.07 [TJOI2013]最长上升子序列(Treap+DP)

    2021.12.07 [TJOI2013]最长上升子序列(Treap+DP) https://www.luogu.com.cn/problem/P4309 题意: 给定一个序列,初始为空.现在我们将1 ...

  4. Bzoj 3173: [Tjoi2013]最长上升子序列 平衡树,Treap,二分,树的序遍历

    3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1183  Solved: 610[Submit][St ...

  5. bzoj 3173 [Tjoi2013]最长上升子序列 (treap模拟+lis)

    [Tjoi2013]最长上升子序列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2213  Solved: 1119[Submit][Status] ...

  6. BZOJ 3170: [Tjoi 2013]松鼠聚会 切比雪夫距离

    3170: [Tjoi 2013]松鼠聚会 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...

  7. BZOJ 3170: [Tjoi 2013]松鼠聚会( sort )

    题目的距离为max(|x1-x2|, |y1-y2|) (切比雪夫距离). 切比雪夫距离(x, y)->曼哈顿距离((x+y)/2, (x-y)/2) (曼哈顿(x, y)->切比雪夫(x ...

  8. Bzoj 3170[Tjoi 2013]松鼠聚会 曼哈顿距离与切比雪夫距离

    3170: [Tjoi 2013]松鼠聚会 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1318  Solved: 664[Submit][Stat ...

  9. 【bzoj3173】【Tjoi2013】【最长上升子序列】treap+dp二分优化

    [pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=61560361 向大(hei)佬(e)实力学(di ...

随机推荐

  1. 真正解决iframe高度自适应问题

    1.前言 解决iframe高度自适应问题有两种方法1.pym2.手动设置iframe的高度 本文主要是总结第二种实现方式,因为第一种pym.js插件我没用懂 如果使用iframe时,遇到以下的需求: ...

  2. Django【第27篇】:ModelForm

    基于Form组件实现的增删改和基于ModelForm实现的增删改 一.ModelForm的介绍 ModelForm a. class Meta: model, # 对应Model的 fields=No ...

  3. SSM整合中错误:Data truncation: Data too long for column 'gender' at row 1

    错误描述 ### SQL: insert into t_customer(name,gender,phone,address) values (?,?,?,?) ### Cause: com.mysq ...

  4. 【LuoguP2792 】[JSOI2008]小店购物(最小树形图)

    题目链接 题目描述 小店的优惠方案十分简单有趣: 一次消费过程中,如您在本店购买了精制油的话,您购买香皂时就可以享受2.00元/块的优惠价:如果您在本店购买了香皂的话,您购买可乐时就可以享受1.50元 ...

  5. postman-关联

    1.提取 在Tests提取接口1的值如:userid //将获取的json数据赋给变量 var jsonData=pm.response.json(); //获取返回的userid值 user_id= ...

  6. 颜色空间模型 与 Opencv中的HSV模型范围

    颜色空间总结 RGB.HSV.YUV 什么是颜色 Wiki是这样说的:颜色或色彩是通过眼.脑和我们的生活经验所产生的一种对光的视觉效应.嗯,简单点说,颜色就是人对光的一种感觉,由大脑产生的一种感觉.感 ...

  7. 音频学习(一)-离线播放(AVAudioPlayer)

    最后更新:2017-05-23 方法 - (nullable instancetype)initWithContentsOfURL:(NSURL *)url error:(NSError **)out ...

  8. LR之流程

    一.新建事务 如何估算一个业务流程呢?一个业务流程的持续时间:登录,预定机票等等的花费时间,通常是几个步骤构成的,所以在LR中需要标记事物,作为评测业务的时间. 1.打开Basic_Tutorial脚 ...

  9. 20175214 《Java程序设计》第11周学习总结

    20175214 <Java程序设计>第11周学习总结 本周学习任务总结 1.根据<java2实用教程>和蓝墨云学习视频学习第十三章: 2.尝试将课本重点内容用自己的话复述手打 ...

  10. Django学习之视图

    一.Django的View(视图) 1.一个简单的视图 3.CBV和FBV 4.给视图加装饰器 使用装饰器装饰FBV 使用装饰器装饰CBV 二.Request对象和Response对象 1.reque ...