原题:http://www.lydsy.com/JudgeOnline/problem.php?id=3173

题解:促使我写这题的动力是,为什么百度遍地是Treap,黑人问号???

这题可以用线段树做。我们知道,插入一个数只会使答案变大1或不变。用线段树维护长度为i的最长上升子序列末尾的位置。每插入一个数,可以在线段树中找出插入位置,然后更新即可。

  1. #include <bits/stdc++.h>
  2. #define N 100006
  3. using namespace std;
  4. int n,m,x,y,tot,f[N],s[10*N],flag[10*N];
  5. inline int read()
  6. {
  7. int x=0,c=getchar();while(c<'0'||x>'9')c=getchar();
  8. while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+c-48,c=getchar();return x;
  9. }
  10. void down(int x)
  11. {
  12. if(flag[x]){
  13. flag[x<<1]+=flag[x];
  14. flag[x<<1|1]+=flag[x];
  15. s[x]+=flag[x];
  16. flag[x]=0;
  17. }
  18. }
  19. void change(int i,int l,int r,int x,int y)
  20. {
  21. down(i);down(i<<1);down(i<<1|1);
  22. if(l==r){s[i]=y;return;}
  23. int mid=(l+r)>>1;
  24. if(x<=mid)change(i<<1,l,mid,x,y);
  25. else change(i<<1|1,mid+1,r,x,y);
  26. s[i]=max(s[i<<1],s[i<<1|1]);
  27. }
  28. void add(int i,int l,int r,int x,int y)
  29. {
  30. down(i);down(i<<1);down(i<<1|1);
  31. if(x<=l&&r<=y){flag[i]++;down(i);return;}
  32. int mid=(l+r)>>1;
  33. if(x<=mid)add(i<<1,l,mid,x,y);
  34. if(y>mid)add(i<<1|1,mid+1,r,x,y);
  35. s[i]=max(s[i<<1],s[i<<1|1]);
  36. }
  37. int query(int i,int l,int r,int x)
  38. {
  39. down(i);down(i<<1);down(i<<1|1);
  40. if(l==r)return s[i];
  41. int mid=(l+r)>>1;
  42. if(x<=mid)return query(i<<1,l,mid,x);
  43. return query(i<<1|1,mid+1,r,x);
  44. }
  45. int ask(int x)
  46. {
  47. int l=0,r=tot,ans=0;
  48. while(l<=r){
  49. int mid=(l+r)>>1;
  50. if(query(1,1,n,mid)<=x)ans=mid,l=mid+1;
  51. else r=mid-1;
  52. }
  53. return ans;
  54. }
  55. int main()
  56. {
  57. n=read();
  58. x=read();tot=1;
  59. change(1,1,n,1,1);
  60. printf("1\n");
  61. for(int i=2;i<=n;i++){
  62. x=read();
  63. int tmp=ask(x);
  64. if(tmp<tot)add(1,1,n,tmp+1,tot);
  65. change(1,1,n,tmp+1,x+1);
  66. tot=max(tot,tmp+1);
  67. printf("%d\n",tot);
  68. }
  69. }

  

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. 【BZOJ】3173: [Tjoi2013]最长上升子序列(树状数组)

    [题意]给定ai,将1~n从小到大插入到第ai个数字之后,求每次插入后的LIS长度. [算法]树状数组||平衡树 [题解] 这是树状数组的一个用法:O(n log n)寻找前缀和为k的最小位置.(当数 ...

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

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

随机推荐

  1. Python2 下 Unicode 的一个小bug

    关于Python的编码问题已经是老生常谈了,此处主要是介绍一个罕见的问题,也算是Python2的一个bug了(Python3不会有此问题). 在有时候我们去爬取网页或者调用一些第三方库获取文本的时候, ...

  2. Python实战:扫描key完整性

    之前在国际版本中,需要支持中英文切换功能,在如此繁多的源文件里要查找源文件里的key是语言资源包是否对应. 正好运用在之前学的python,写了个工具,支持自定义替换标签,批量处理源文件.现在看来,效 ...

  3. Django视图与网址

    Django中网址是写在 urls.py 文件中,用正则表达式对应 views.py 中的一个函数(或者generic类),我们用一个项目来演示. 下载本节所有源代码: 学习编程最好的办法就是动手敲代 ...

  4. Python爬虫:Xpath语法笔记

    一.选取节点 常用的路劲表达式: 表达式 描述 实例   nodename 选取nodename节点的所有子节点 xpath(‘//div’) 选取了div节点的所有子节点 / 从根节点选取 xpat ...

  5. poj1323-Game Prediction(贪心思想)

    贪心的思想:尽量的从最大值找起.然后在剩余之中,再从最大值找起. 一,题意: M个人,每人N张牌,每轮比较谁出的牌大,最大者为胜.现在给定M和N,以及你的牌,要求输出你至少能确保获得几轮的胜利 从&q ...

  6. swift-重写方法和属性、禁止重写

    /*子类可以为继承来的实例方法,类方法,实例属性,或下标提供自己定制的实现.我们把这种行为叫重写. 如果要重写某个特性,你需要在重写定义的前面加上 关键字.这么做,你就表明了你是想提供一个重写 版本, ...

  7. E/dalvikvm: Could not find class...

    logcat日志输出信息: - ::-/net.chiangfai I/dalvikvm: Could not find method android.content.res.Resources.ge ...

  8. PHP中GBK和UTF8乱码解决方案

    我用的appserv-win32-2.5.10做的环境,装这个包的时候用默认的utf8编码.在写数据库连接文件时,写成: $conn = mysql_connect("$host" ...

  9. apachetop 实时监控apache指定日志

    编译安装,压缩包戳我下载 帮助文档 # apachetop -h ApacheTop v0.12.6 - Usage: File options: -f logfile open logfile (a ...

  10. Java Basic Exception

    异常处理经验小结之一:不要直接抛出InvocationTargetException  (转http://olylakers.iteye.com/blog/1137371) 在最近一段时间的工作中,积 ...