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

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 1613  Solved: 839
[Submit][Status][Discuss]

Description

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

Input

第一行一个整数N,表示我们要将1到N插入序列中,接下是N个数字,第k个数字Xk,表示我们将k插入到位置Xk(0<=Xk<=k-1,1<=k<=N)

Output

N行,第i行表示i插入Xi位置后序列的最长上升子序列的长度是多少。

Sample Input

3
0 0 2

Sample Output

1
1
2

HINT

100%的数据 n<=100000


插入的数字是递增的,也就是说插入数字后不会改变其他元素的dp值

有一个离线做法:用treap动态把序列弄出来然后求lis

http://hzwer.com/6254.html

在线用splay,f表示以当前元素结尾的LIS长度,mx表示他的子树里最大的f

把新插入的元素转到根后,f就是左子树mx+1(不可能有非法的因为递增啊)

注意:

1.别忘哨兵

2.别忘更新size时还要+1

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <cmath>
  6. using namespace std;
  7. typedef long long ll;
  8. #define lc t[x].ch[0]
  9. #define rc t[x].ch[1]
  10. #define pa t[x].fa
  11. const int N=1e5+,INF=1e9;
  12. inline int read(){
  13. char c=getchar();int x=,f=;
  14. while(c<''||c>''){if(c=='-')f=-; c=getchar();}
  15. while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
  16. return x*f;
  17. }
  18.  
  19. int n,k;
  20. struct node{
  21. int ch[],fa,size,v,f,mx;
  22. node():fa(){ch[]=ch[]=;}
  23. }t[N];
  24. int sz,root;
  25. inline int wh(int x){return t[pa].ch[]==x;}
  26. inline void update(int x){
  27. t[x].size=t[lc].size+t[rc].size+;
  28. t[x].mx=max(t[x].f,max(t[lc].mx,t[rc].mx));
  29. }
  30. inline void rotate(int x){
  31. int f=t[x].fa,g=t[f].fa,c=wh(x);
  32. if(g) t[g].ch[wh(f)]=x;t[x].fa=g;
  33. t[f].ch[c]=t[x].ch[c^];t[t[f].ch[c]].fa=f;
  34. t[x].ch[c^]=f;t[f].fa=x;
  35. update(f);update(x);
  36. }
  37. inline void splay(int x,int tar){
  38. for(;t[x].fa!=tar;rotate(x))
  39. if(t[pa].fa!=tar) rotate(wh(x)==wh(pa)?pa:x);
  40. if(tar==) root=x;
  41. }
  42. inline int kth(int k){
  43. int x=root,lsize=;
  44. while(x){
  45. int _=lsize+t[lc].size;
  46. if(_<k&&k<=_+) return x;
  47. else if(k<=_) x=lc;
  48. else lsize=_+,x=rc;
  49. }
  50. return ;
  51. }
  52. inline int nw(int v){
  53. sz++;t[sz].v=v;t[sz].size=;
  54. return sz;
  55. }
  56. inline void Sol(int k,int v){//printf("Sol %d %d\n",k,v);
  57. int f=kth(k+);splay(f,);//puts("hi");
  58. int x=kth(k+);splay(x,f);//printf("ran %d %d\n",f,x);
  59. lc=nw(v);t[lc].fa=x;
  60. update(x);update(f);
  61. splay(sz,);
  62. t[sz].f=t[t[sz].ch[]].mx+;update(sz); //printf("f %d %d %d\n",sz,t[sz].ch[0],t[sz].f);
  63. printf("%d\n",t[sz].mx);
  64. }
  65. int main(){
  66. //freopen("in.txt","r",stdin);
  67. n=read();
  68. root=nw();t[root].ch[]=nw(N);t[sz].fa=root;
  69. for(int i=;i<=n;i++){
  70. k=read();
  71. Sol(k,i);
  72. }
  73. }

BZOJ 3173: [Tjoi2013]最长上升子序列 [splay DP]的更多相关文章

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

    一眼切~ 重点是按照 $1$~$n$ 的顺序插入每一个数,这样的话就简单了. #include <cstdio> #include <algorithm> #define N ...

  2. bzoj 3173: [Tjoi2013]最长上升子序列【dp+线段树】

    我也不知道为什么把题看成以插入点为结尾的最长生生子序列--还WA了好几次 先把这个序列最后的样子求出来,具体就是倒着做,用线段树维护点数,最开始所有点都是1,然后线段树上二分找到当前数的位置,把这个点 ...

  3. BZOJ 3173: [Tjoi2013]最长上升子序列( BST + LIS )

    因为是从1~n插入的, 慢插入的对之前的没有影响, 所以我们可以用平衡树维护, 弄出最后的序列然后跑LIS就OK了 O(nlogn) --------------------------------- ...

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

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

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

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

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

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

  7. BZOJ 3173 [Tjoi2013] 最长上升子序列 解题报告

    这个题感觉比较简单,但却比较容易想残.. 我不会用树状数组求这个原排列,于是我只好用线段树...毕竟 Gromah 果弱马. 我们可以直接依次求出原排列的元素,每次找到最小并且最靠右的那个元素,假设这 ...

  8. BZOJ 3173: [Tjoi2013]最长上升子序列 (线段树+BIT)

    先用线段树预处理出每个数最终的位置.然后用BIT维护最长上升子序列就行了. 用线段树O(nlogn)O(nlogn)O(nlogn)预处理就直接倒着做,每次删去对应位置的数.具体看代码 CODE #i ...

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

    原题:http://www.lydsy.com/JudgeOnline/problem.php?id=3173 题解:促使我写这题的动力是,为什么百度遍地是Treap,黑人问号??? 这题可以用线段树 ...

随机推荐

  1. CLR 简介

    (一)CLR介绍 CLR是一个可以由多编程语言使用的运行时,CLR的核心功能:内存管理,程序集加载,安全性,异常处理,线程同步等等.可以被很多属于微软系列的开发语言使用. 事实上,在运行时,CLR根本 ...

  2. angular $modal模态框

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. TCP为什么需要3次握手与4次挥手(转载)

    为什么需要“三次握手” 在谢希仁著<计算机网络>第四版中讲“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”.在另一部经典的<计算机网络> ...

  4. webpack打包非模块化js

    本文主要记录了非模块化js如何使用webpack打包 模块化打包实现方式 webpack是模块打包工具,通过入口文件递归遍历其依赖图谱,绝对是打包神器. bar.js export default f ...

  5. 2017-6-14 踩坑小结(Android文件读写 相关问题)

    填坑 getSlotFromBufferLocked: unknown buffer: 0xab7115e0 1. 在棉花糖(6.0)上莫名出现 未知缓冲 错误,百度了一下,貌似这个是Android6 ...

  6. Oracle_建表

    Oracle_建表 --设计要求: --建立一张用来存储学生信息的表 --字段包含学号.姓名.性别,年龄.入学日期.班级,email等信息   create table student(        ...

  7. BC高精确度函数使用。

    bc是Binary Calculator的缩写.bc*函数的参数都是操作数加上一个可选的 [int scale],比如string bcadd(string $left_operand, string ...

  8. 用程序读取CSV文件的方法

    CSV全称 Comma Separated values,是一种用来存储数据的纯文本文件格式,通常用于电子表格或数据库软件.用Excel或者Numbers都可以导出CSV格式的数据. CSV文件的规则 ...

  9. -------- Rootkit 核心技术——利用 nt!_MDL 突破 KiServiceTable 的只读访问限制 Part II --------

    ------------------------------------------------------------------------------------------- 本篇开始进入正题 ...

  10. 在eclipse中创建maven webapp项目时弹出错误-解决办法

    在eclipse中创建maven webapp项目时报错: Could not resolve archetype org.apache.maven.archetypes:maven-archetyp ...