正题

题目链接:https://www.luogu.com.cn/problem/P4309


题目大意

nnn次,第iii次在第xix_ixi​个数字后面插入iii然后询问最长上升子序列长度。


解题思路

因为是插入所以考虑用SplaySplaySplay维护,因为从小到大插入,其实每次就是找一个在xix_ixi​前面最大的fif_ifi​就好了,这个也用SplaySplaySplay维护即可。

时间复杂度O(nlog⁡n)O(n\log n)O(nlogn)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int n,cnt,root,f[N],g[N],ans;
int t[N][2],fa[N],siz[N];
bool Direct(int x)
{return t[fa[x]][1]==x;}
void Connect(int x,int y,int dir)
{t[x][dir]=y;fa[y]=x;return;}
void PushUp(int x){g[x]=max(max(g[t[x][0]],g[t[x][1]]),f[x]);siz[x]=siz[t[x][0]]+siz[t[x][1]]+1;return;
}
void Rotate(int x){int y=fa[x],z=fa[y];int xs=Direct(x),ys=Direct(y);int w=t[x][xs^1];Connect(z,x,ys);Connect(y,w,xs);Connect(x,y,xs^1);PushUp(y);PushUp(x);return;
}
void Splay(int x,int f){while(fa[x]!=f){int y=fa[x];if(fa[y]==f)Rotate(x);else if(Direct(x)==Direct(y))Rotate(y),Rotate(x);else Rotate(x),Rotate(x);}if(!f)root=x;return;
}
int Find(int x,int k){if(siz[t[x][0]]>=k)return Find(t[x][0],k);if(siz[t[x][0]]+1==k)return x;return Find(t[x][1],k-siz[t[x][0]]-1);
}
int main()
{scanf("%d",&n);t[2][0]=siz[1]=siz[2]=1;fa[1]=root=cnt=2;for(int i=1;i<=n;i++){int k;scanf("%d",&k);int x=Find(root,k+1),y=Find(root,k+2);Splay(y,0);Splay(x,y);t[x][1]=++cnt;fa[cnt]=x;f[cnt]=g[cnt]=g[x]+1;siz[cnt]=1;ans=max(ans,f[cnt]);printf("%d\n",ans);PushUp(x);PushUp(y);Splay(cnt,0);}return 0;
}

P4309-[TJOI2013]最长上升子序列【Splay】相关推荐

  1. P4309 [TJOI2013]最长上升子序列 平衡树 + dp

    传送门 文章目录 题意: 思路: 题意: 思路: 注意到一个很关键的条件,每次插入iii,而iii是递增的,也就是说插入iii之后只会从前面的最大值转移过来,所以我们现在只需要维护插入操作即可,这个显 ...

  2. BZOJ3173:[TJOI2013]最长上升子序列(Splay)

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

  3. BZOJ3173 [TJOI2013]最长上升子序列

    题面: 3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 2108  Solved: 1067 [Sub ...

  4. [BZOJ]3173: [Tjoi2013]最长上升子序列

    题解:   考虑按照元素升序加入  所以对位置在其后的元素LIS无影响 然后从前面位置的最大值转移过来就行 ,,,,平衡树无脑模拟 #include <algorithm> #includ ...

  5. [TJOI2013]最长上升子序列

    [TJOI2013]最长上升子序列 题目大意: 给定一个序列,初始为空.将\(1\sim n(n\le10^5)\)的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数字后输出LIS长 ...

  6. BZOJ 3173: [Tjoi2013]最长上升子序列

    3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1524  Solved: 797 [Submit][ ...

  7. [BZOJ3173][Tjoi2013]最长上升子序列

    [BZOJ3173][Tjoi2013]最长上升子序列 试题描述 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数字,我们都想知道此时最长上 ...

  8. bzoj 3173: [Tjoi2013]最长上升子序列(离线二分+树状数组)

    3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 2051  Solved: 1041 [Submit] ...

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

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

  10. bzoj3173: [Tjoi2013]最长上升子序列(fhqtreap)

    这题用fhqtreap可以在线. fhqtreap上维护以i结尾的最长上升子序列,数字按从小到大加入, 因为前面的数与新加入的数无关, 后面的数比新加入的数小, 所以新加入的数对原序列其他数的值没有影 ...

最新文章

  1. 推荐系统去偏(Debiased Recommendation)研究进展概述
  2. 两个分数化简比怎么化_我学《分数的意义》心得
  3. 分享一个基于.NET6包含DDD,ES,CQRS等概念的开源项目
  4. WPF中解决内存泄露的几点提示与解决方法
  5. 改写DataCogs在MOSS列表中实现三级联动字段
  6. 阿里巴巴公布香港IPO定价:每股176港元
  7. 为什么现在的年轻人越来越不愿意结婚、生子了?
  8. 南阳OJ 16 矩形嵌套
  9. 射频电路学习之Smith圆图
  10. Scratch案例——放烟花
  11. App低代码开发的最终形态?APICloud可视化开发初体验
  12. ARM处理器开发详解(一)
  13. 2021年起重机械指挥考试题库及起重机械指挥最新解析
  14. 北邮校长方滨兴临别奉送学生“六好”锦囊
  15. Debug 武侠世界
  16. Oracle net architecture
  17. Codeforces 605E :Intergalaxy Trips
  18. 利用火绒安全软件修改host文件,加速访问GitHub网站
  19. 搭建svn://模式的svn服务器
  20. java毕业设计网络招聘系统源码+lw文档+mybatis+系统+mysql数据库+调试

热门文章

  1. python eval函数_Python eval 函数妙用
  2. 湖南工业职业技术学院计算机协会,计算机网络协会
  3. 因子分析最少要有几个因子_Re0:魔女司教和魔女是什么关系?他们的魔女因子是魔女给的吗...
  4. oracle未找到时区,Oracle ADF 未找到时区错误
  5. java反射 获取局部变量_Java反射:如何获取变量的名称?
  6. 评价的等级优良差_满意程度等级划分
  7. mysql 碎片率_MySQL数据碎片的整理和分析
  8. python分布式爬虫及数据存储_二十一 Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫数据保存...
  9. leetcode98. 验证二叉搜索树
  10. 《C++ Primer》14.1节练习