P4309-[TJOI2013]最长上升子序列【Splay】
正题
题目链接:https://www.luogu.com.cn/problem/P4309
题目大意
nnn次,第iii次在第xix_ixi个数字后面插入iii然后询问最长上升子序列长度。
解题思路
因为是插入所以考虑用SplaySplaySplay维护,因为从小到大插入,其实每次就是找一个在xix_ixi前面最大的fif_ifi就好了,这个也用SplaySplaySplay维护即可。
时间复杂度O(nlogn)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】相关推荐
- P4309 [TJOI2013]最长上升子序列 平衡树 + dp
传送门 文章目录 题意: 思路: 题意: 思路: 注意到一个很关键的条件,每次插入iii,而iii是递增的,也就是说插入iii之后只会从前面的最大值转移过来,所以我们现在只需要维护插入操作即可,这个显 ...
- BZOJ3173:[TJOI2013]最长上升子序列(Splay)
Description 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数字,我们都想知道此时最长上升子序列长度是多少? Input 第一行一 ...
- BZOJ3173 [TJOI2013]最长上升子序列
题面: 3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 2108 Solved: 1067 [Sub ...
- [BZOJ]3173: [Tjoi2013]最长上升子序列
题解: 考虑按照元素升序加入 所以对位置在其后的元素LIS无影响 然后从前面位置的最大值转移过来就行 ,,,,平衡树无脑模拟 #include <algorithm> #includ ...
- [TJOI2013]最长上升子序列
[TJOI2013]最长上升子序列 题目大意: 给定一个序列,初始为空.将\(1\sim n(n\le10^5)\)的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数字后输出LIS长 ...
- BZOJ 3173: [Tjoi2013]最长上升子序列
3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1524 Solved: 797 [Submit][ ...
- [BZOJ3173][Tjoi2013]最长上升子序列
[BZOJ3173][Tjoi2013]最长上升子序列 试题描述 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数字,我们都想知道此时最长上 ...
- bzoj 3173: [Tjoi2013]最长上升子序列(离线二分+树状数组)
3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 2051 Solved: 1041 [Submit] ...
- 【bzoj 3173】[Tjoi2013]最长上升子序列
Description 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数字,我们都想知道此时最长上升子序列长度是多少? Input 第一行一 ...
- bzoj3173: [Tjoi2013]最长上升子序列(fhqtreap)
这题用fhqtreap可以在线. fhqtreap上维护以i结尾的最长上升子序列,数字按从小到大加入, 因为前面的数与新加入的数无关, 后面的数比新加入的数小, 所以新加入的数对原序列其他数的值没有影 ...
最新文章
- 推荐系统去偏(Debiased Recommendation)研究进展概述
- 两个分数化简比怎么化_我学《分数的意义》心得
- 分享一个基于.NET6包含DDD,ES,CQRS等概念的开源项目
- WPF中解决内存泄露的几点提示与解决方法
- 改写DataCogs在MOSS列表中实现三级联动字段
- 阿里巴巴公布香港IPO定价:每股176港元
- 为什么现在的年轻人越来越不愿意结婚、生子了?
- 南阳OJ 16 矩形嵌套
- 射频电路学习之Smith圆图
- Scratch案例——放烟花
- App低代码开发的最终形态?APICloud可视化开发初体验
- ARM处理器开发详解(一)
- 2021年起重机械指挥考试题库及起重机械指挥最新解析
- 北邮校长方滨兴临别奉送学生“六好”锦囊
- Debug 武侠世界
- Oracle net architecture
- Codeforces 605E :Intergalaxy Trips
- 利用火绒安全软件修改host文件,加速访问GitHub网站
- 搭建svn://模式的svn服务器
- java毕业设计网络招聘系统源码+lw文档+mybatis+系统+mysql数据库+调试
热门文章
- python eval函数_Python eval 函数妙用
- 湖南工业职业技术学院计算机协会,计算机网络协会
- 因子分析最少要有几个因子_Re0:魔女司教和魔女是什么关系?他们的魔女因子是魔女给的吗...
- oracle未找到时区,Oracle ADF 未找到时区错误
- java反射 获取局部变量_Java反射:如何获取变量的名称?
- 评价的等级优良差_满意程度等级划分
- mysql 碎片率_MySQL数据碎片的整理和分析
- python分布式爬虫及数据存储_二十一 Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫数据保存...
- leetcode98. 验证二叉搜索树
- 《C++ Primer》14.1节练习