https://www.lydsy.com/JudgeOnline/problem.php?id=3173

http://acm.hdu.edu.cn/showproblem.php?pid=3564

(本代码没有交到HDU上,因为要写多组数据,而博主懒orz)

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

这题妙是妙,不过也很经典了,以及TJOI又考原题……

听说平衡树可以无脑过?但是不会写splay,stl又特别慢怎么办?

显然顺序插入改成逆序删除,在线段树上维护一下就能得到每个元素插入的位置pos。

然后实际上lcs[i]=lcs[i-1]+1因为我们永远插的是最大值,所以我们要找到已经插入的最后一个比i小的pos。

不是很好找这个pos,想到lcs的单调不降于是维护一个dp[i]表示i长度的最长上升子序列末位的pos的最小值。

这样每次插的时候都在dp数组里面lower_bound pos(也就是最后一个小于pos的值+1),然后直接更新dp数组即可。

  1. #include<map>
  2. #include<cmath>
  3. #include<stack>
  4. #include<queue>
  5. #include<cstdio>
  6. #include<cctype>
  7. #include<vector>
  8. #include<cstdlib>
  9. #include<cstring>
  10. #include<iostream>
  11. #include<algorithm>
  12. using namespace std;
  13. typedef long long ll;
  14. const int N=1e5+;
  15. inline int read(){
  16. int X=,w=;char ch=;
  17. while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
  18. while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
  19. return w?-X:X;
  20. }
  21. int n,tr[N*],a[N],pos[N],dp[N],len;
  22. void build(int a,int l,int r){
  23. if(l==r){
  24. tr[a]=;return;
  25. }
  26. int mid=(l+r)>>;
  27. build(a<<,l,mid);build(a<<|,mid+,r);
  28. tr[a]=tr[a<<]+tr[a<<|];
  29. }
  30. void del(int a,int l,int r,int x,int y){
  31. tr[a]--;
  32. if(l==r){
  33. pos[x]=l;return;
  34. }
  35. int mid=(l+r)>>;
  36. if(y<=tr[a<<])del(a<<,l,mid,x,y);
  37. else del(a<<|,mid+,r,x,y-tr[a<<]);
  38. }
  39. int main(){
  40. n=read();
  41. for(int i=;i<=n;i++)pos[i]=read()+;
  42. build(,,n);
  43. for(int i=n;i>=;i--)del(,,n,i,pos[i]);
  44. for(int i=;i<=n;i++){
  45. int k=lower_bound(dp+,dp+len+,pos[i])-dp;
  46. len=max(len,k);
  47. dp[k]=pos[i];
  48. printf("%d\n",len);
  49. }
  50. return ;
  51. }

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

BZOJ3173:[TJOI2013]最长上升子序列 & HDU3564:Another LIS——题解的更多相关文章

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

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

  2. bzoj3173: [Tjoi2013]最长上升子序列(树状数组+二分倒推)

    3173: [Tjoi2013]最长上升子序列 题目:传送门 题解:  好题! 怎么说吧...是应该扇死自己...看错了两次题: 每次加一个数的时候,如果当前位置有数了,是要加到那个数的前面,而不是直 ...

  3. bzoj3173[Tjoi2013]最长上升子序列 平衡树+lis

    3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2253  Solved: 1136[Submit][S ...

  4. BZOJ3173 TJOI2013最长上升子序列(Treap+ZKW线段树)

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

  5. bzoj千题计划316:bzoj3173: [Tjoi2013]最长上升子序列(二分+树状数组)

    https://www.lydsy.com/JudgeOnline/problem.php?id=3173 插入的数是以递增的顺序插入的 这说明如果倒过来考虑,那么从最后一个插入的开始删除,不会对以某 ...

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

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

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

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

  8. BZOJ3173 TJOI2013最长上升子序列(splay)

    容易发现如果求出最后的序列,只要算一下LIS就好了.序列用平衡树随便搞一下,这里种一棵splay. #include<iostream> #include<cstdio> #i ...

  9. 【LG4309】【BZOJ3173】[TJOI2013]最长上升子序列

    [LG4309][BZOJ3173][TJOI2013]最长上升子序列 题面 洛谷 BZOJ 题解 插入操作显然用平衡树就行了 然后因为后面的插入对前面的操作无影响 就直接在插入完的序列上用树状数组求 ...

随机推荐

  1. SpringBoot学习:整合MyBatis,使用Druid连接池

    项目下载地址:http://download.csdn.NET/detail/aqsunkai/9805821 (一)添加pom依赖: <!-- https://mvnrepository.co ...

  2. 使用 adb 命令一次性为多个设备安装 apk

    使用 adb 命令一次性为多个设备安装 apk 原创 2016年07月15日 10:40:53 3154 命令简介 adb install [-lrtsdg] (file) 把包文件推送到设备上并安装 ...

  3. selenium--特殊元素定位

    该篇博客总结特殊元素(select.radio\checkbox.时间控件.文件上传.图片验证码.模拟鼠标操作.Js 或 JQuery调用)操作. 1.select @Test public void ...

  4. 前端开发工程师 - 04.页面架构 - CSS Reset & 布局解决方案 & 响应式 & 页面优化 &规范与模块化

    04.页面架构 第1章--CSS Reset 第2章--布局解决方案 居中布局 课堂交流区 水平列表的底部对齐 如图所示,一个水平排列的列表,每项高度都未知,但要求底部对齐,有哪些方法可以解决呢? & ...

  5. chorme打开网页的技巧

    恢复之前关闭的网页 ctr l+ shift + t 打开之前不小心关闭的网页 临时书签 在设置书签中有 为打开的网页添加书签 的选项, 清除地址栏搜索记录 首先需要退出个人谷歌账户,账户上的搜索记录 ...

  6. CTC (Connectionist Temporal Classification) 算法原理

    (原创文章,转载请注明出处哦~) 简单介绍CTC算法 CTC是序列标注问题中的一种损失函数. 传统序列标注算法需要每一时刻输入与输出符号完全对齐.而CTC扩展了标签集合,添加空元素. 在使用扩展标签集 ...

  7. mysql下分组取关联表指定提示方法,类似于mssql中的cross apply

    转至:https://stackoverflow.com/questions/12113699/get-top-n-records-for-each-group-of-grouped-results ...

  8. URAL 1664 Pipeline Transportation(平面图最大流)

    Description An oligarch Vovan, as many other oligarchs, transports oil from West Cuckooland to East ...

  9. Hadoop 版本 生态圈 MapReduce模型

    忘的差不多了, 先补概念, 然后开始搭建集群实战 ... . 一 Hadoop版本 和 生态圈 1. Hadoop版本 (1) Apache Hadoop版本介绍 Apache的开源项目开发流程 : ...

  10. HDU 5816 Hearthstone 概率dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5816 Hearthstone Time Limit: 2000/1000 MS (Java/Othe ...