[TJOI]2013 最长上升子序列
这个题据说是Splay,或者说是平衡树的模板题,但是我还是不会做……唉……
\(\color{red}{Description}\)
给定一个序列,初始为空。现在我们将\(1\)到\(N\)的数字插入到序列中,每次将一个数字插入到一个特定的位置。每插入一个数字,我们都想知道此时最长上升子序列长度是多少?
输入格式:
第一行一个整数\(N\),表示我们要将\(1\)到\(N\)插入序列中。
接下是\(N\)个数字,第\(k\)个数字\(X_k\),表示我们将\(k\)插入到位置\(X_k\) \((0<=X_k<=k-1,1<=k<=N)\)
输出格式:
\(N\)行,第\(i\)行表示\(i\)插入\(X_i\)位置后序列的最长上升子序列的长度是多少。
$\color{purple}{Half -Solution} $
首先很明显的是,我们的权值就是\(i\),在插入的时候我们就按照他的实际位置插入,然后找它之前的第一个点,把当前节点变成找到的节点右儿子即可。
那么现在有一个问题,我们在维护完这个序列之后,如何确定它的\(LIS\)呢?听\(rqy\)说,是可以在每次插入的时候在线输出的,但是我觉得完全可以把它处理成一个离线问题,最后复制\(Splay\)的中序遍历,然后再对这个数组\(nlogn\)求一遍\(LIS\)。
但我实在不想写了,现在身心俱疲。
于是我就等着什么时候可以学会在线输出的算法,再把这个题\(A\)掉吧。
他们都在复习中考数学,初中奥数,或者说是预习,因为要考推荐生了。而我现在还在和这个题鏖战……不知道推荐生能不能过……唉……
我选择\(\color{silver}{Waiting}\)
#include<iostream>
#include<cstdio>
#define MAXN 100010
#define il inline
using namespace std;
struct tree{
int maxf,v,sub,son[2],f,pos;
}s[MAXN];
bool w;
int f[MAXN],n,root,wz,fnow,now,ffnow,temp[MAXN],base[MAXN];
il void update(int x){
if(x){
s[x].sub=1;
if(s[x].son[0])s[x].sub+=s[s[x].son[0]].sub;
if(s[x].son[1])s[x].sub+=s[s[x].son[1]].sub;
}
}
il void push_up(int x){
maxf=max(f[x])
}
il bool which(int x){
return x==s[s[x].f].son[1];
}
il void rotate(int x){
fnow=s[x].f,ffnow=s[fnow].f;
w=which(x);
s[fnow].son[w]=s[x].son[w^1];
s[s[x].son[w^1]].f=fnow;
s[x].f=ffnow;
if(ffnow){
s[ffnow].son[fnow==s[ffnow].son[1]]=x;
}
s[x].son[w^1]=fnow;
s[fnow].f=x;
update(fnow);
update(x);
}
il void splay(int x,int goal){
for(int qwq;(qwq=s[x].f)!=goal;rotate(x)){
if(s[qwq].f!=goal){
rotate(which(x)==which(qwq)?qwq:x);
}
}
if(!goal){
root=x;
}
}
il void insert(int pos,int x){
if(!root){
wz++;
s[wz].son[1]=s[wz].son[0]=s[wz].f=0;
s[wz].sub=1;
s[wz].v=x;
return ;
}
if(!pos){
wz++;
s[wz].son[1]=root;
s[wz].f=s[wz].son[0]=0;
s[wz].v=x;
root=wz;
update(wz);
return ;
}
int now=root;
while(1){
if(s[now].son[0]&&x<=s[s[now].son[0]].sub)
now=s[now].son[0];
else {
int temp=(s[now].son[0]?s[s[now].son[0].sub]:0)+1;
if(x<=temp)break;
x-=temp;
now=s[now].son[1];
}
}
wz++;
s[wz].son[1]=s[now].son[1];
s[s[now].son[1]].f=wz;
s[now].son[1]=wz;
s[wz].f=now;
update(wz);
update(now);
pushup(wz);
pushup(now);
splay(wz);
cout<<s[wz].maxf<<endl;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>temp[i];
}
for(int i=1;i<=n;i++)}{
insert(temp[i],i);
}
}
[TJOI]2013 最长上升子序列的更多相关文章
- [BZOJ 3173] [TJOI 2013] 最长上升子序列(fhq treap)
[BZOJ 3173] [TJOI 2013] 最长上升子序列(fhq treap) 题面 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数 ...
- LCS最长公共子序列(最优线性时间O(n))
这篇日志主要为了记录这几天的学习成果. 最长公共子序列根据要不要求子序列连续分两种情况. 只考虑两个串的情况,假设两个串长度均为n. 一,子序列不要求连续. (1)动态规划(O(n*n)) (转自:h ...
- HDU 3998 Sequence (最长上升子序列+最大流)
参考链接:http://www.cnblogs.com/gentleh/archive/2013/03/30/2989958.html 题意:求一个序列的最长上升子序列,及其个数(注意:两个最长上升子 ...
- DP:LCS(最长公共子串、最长公共子序列)
1. 两者区别 约定:在本文中用 LCStr 表示最长公共子串(Longest Common Substring),LCSeq 表示最长公共子序列(Longest Common Subsequence ...
- LCS最长公共子序列HDU1159
最近一直在学习算法,基本上都是在学习动态规划以及字符串.当然,两者交集最经典之一则是LCS问题. 首先LCS的问题基本上就是在字符串a,b之间找到最长的公共子序列,比如 YAOLONGBLOG 和 Y ...
- 动态规划--最长上升子序列(Longest increasing subsequence)
前面写了最长公共子序列的问题.然后再加上自身对动态规划的理解,真到简单的DP问题很快就解决了.其实只要理解了动态规划的本质,那么再有针对性的去做这方的题目,思路很快就会有了.不错不错~加油 题目描述: ...
- BZOJ3173:[TJOI2013]最长上升子序列 & HDU3564:Another LIS——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3173 http://acm.hdu.edu.cn/showproblem.php?pid=3564 ...
- Longest Increasing Subsequences(最长递增子序列)的两种DP实现
一.本文内容 最长递增子序列的两种动态规划算法实现,O(n^2)及O(nlogn). 二.问题描述 最长递增子序列:给定一个序列,从该序列找出最长的 升序/递增 子序列. 特点:1.子序列不要 ...
- 用python实现最长公共子序列算法(找到所有最长公共子串)
软件安全的一个小实验,正好复习一下LCS的写法. 实现LCS的算法和算法导论上的方式基本一致,都是先建好两个表,一个存储在(i,j)处当前最长公共子序列长度,另一个存储在(i,j)处的回溯方向. 相对 ...
随机推荐
- HDU 2955(01背包)
http://acm.hdu.edu.cn/showproblem.php?pid=2955 这道题求不被抓时的最大金钱.金额是整数,概率是小数.因为数组小标不能是小数,所以我们可以以钱作为weigh ...
- springcloud 实战 feign使用中遇到的相关问题
springcloud 实战 feign使用中遇到的相关问题 1.使用feign客户端调用其他微服务时,session没有传递成功,sessionId不一样. /** * @author xbchen ...
- 一步一步实现web程序信息管理系统之二----后台框架实现跳转登陆页面
SpringBoot springboot的目的是为了简化spring应用的开发搭建以及开发过程.内部使用了特殊的处理,使得开发人员不需要进行额外繁锁的xml文件配置的编写,其内部包含很多模块的配置只 ...
- 洛谷 P3391 文艺平衡树
题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 --b ...
- ps入门教程:photoshop工作界面
请大家安装好PS(这不是废话嘛……),然后将PS的界面熟悉一下,消除对PS的惧怕心理~~学会新建文件和保存文件,学会设置参考线. 安装完毕后,打开PS,就进入了PS的操作界面,我们来看一下[图1.1] ...
- 02--CSS的继承性和层叠性
一 继承性 css有两大特性:继承性和层叠性 面向对象语言都会存在继承的概念,在面向对象语言中,继承的特点:继承了父类的属性和方法.那么我们现在主要研究css,css就是在设置属性的.不会牵扯到方法的 ...
- (WPF) Textbox 每次输入触发事件处理
1. Code behind. protected void TextBox1_TextChanged(object sender, EventArgs e) { Label1.Text = Ser ...
- sqlserver查询数据可编辑方法
原文:http://www.cnblogs.com/DaphneOdera/p/6418592.html 第一步.选中表右键,点击编辑前200行. 第二步.数据展示页面点击下图中红线框中的sql按钮 ...
- Grunt入门学习之(3) -- Gruntfile具体示例
经过前面的学习,将测试的Gruntfile整合在一起! /** * Created by Administrator on 2017/6/22. */ module.exports = functio ...
- appium定位安装包启动类名称
cmd输入:adb logcat > d:/1.txt 然后运行APP,关闭APP,到D盘查找文件1,Ctrl+F,输入LAUNCHER,定位启动类,如下图所示位置 即为,eclipse调用A ...