由于他添加的数字单调上升,所以答案只会在插入的那个数的f值上更新。。

由于之前插入的数都比这个数小,所以直接找区间f最大值。。

这题splay比上个play题好写太多了

不调不试1A  splay辣

码:

#include<iostream>
#include<cstdio>
using namespace std;
int f[100005],g[100005],ch[100005][2],sz[100005],fu[100005],rt,tot,i,ans,k,n;
void up(int o)
{f[o]=max(g[o],max(f[ch[o][0]],f[ch[o][1]]));sz[o]=sz[ch[o][0]]+sz[ch[o][1]]+1;
}void set(int a,int wh,int b)
{ch[a][wh]=b;if(b)fu[b]=a;up(a);
}
int getwh(int o)
{return ch[fu[o]][0]==o?0:1;
}
void rotate(int o)
{
int fa=fu[o],ye=fu[fa];
int wh=getwh(o);
set(fa,wh,ch[o][wh^1]);
set(o,wh^1,fa);
fu[o]=ye;
if(ye)ch[ye][ch[ye][0]==fa?0:1]=o;
}
void splay(int o,int tar)
{for(;fu[o]!=tar;rotate(o))if(fu[fu[o]]!=tar)getwh(o)==getwh(fu[o])?rotate(fu[o]):rotate(o);if(tar==0)rt=o;
}
int find(int wz)
{int o=rt;while(1){if(sz[ch[o][0]]+1==wz){splay(o,0);return o;}if(sz[ch[o][0]]+1<wz){wz-=sz[ch[o][0]]+1;o=ch[o][1];} else{o=ch[o][0];}}
}
int main()
{scanf("%d",&n);rt=1;sz[1]=sz[2]=1;set(1,1,2);tot=2;  for(i=1;i<=n;i++){scanf("%d",&k);k=ch[find(k+2)][0];++tot;sz[tot]=1;g[tot]=f[k]+1;f[tot]=g[tot];ans=max(ans,g[tot]);while(ch[k][1]!=0)k=ch[k][1];
set(k,1,tot);splay(tot,0);  printf("%d\n",ans);}
}

2017.10.7 最长上升子序列 思考记录相关推荐

  1. 2017.10.8 球形空间产生器sphere 思考记录

    圆心上的点到各点之间的距离相等,所以根据距离公式  sqrt (  (x-x1)^2  +(y-y1)^2 + (z-z1)^2)  可以由相邻两个式子列等式拆平方得到一元一次方程 然后消元求方程的解 ...

  2. 2017.10.17 CF#441 F题 思考记录

    .果然没有题解做题感觉是不一样的. 这个F题可能是最像往常B题的题了(往常B题就是dp,还一般都不难) 首先这个是|,所以|的数越多,它一定是不降的 那么合法的一定是一个数到一个数往后的数所构成的所有 ...

  3. c语言找出递增子数组的长度,求给定数组的最长递增子序列(记录子序列的值)...

    #include using namespace std; const int maxn = 100; int arr[maxn], dp[maxn], pre[maxn]; // pre记录前一个的 ...

  4. 2017.10.10 狼和羊的故事 思考记录

    二集合划分问题,,花费最小,果断最小割 首先狼和羊可能会被分割,所以不能直接在原图上跑 所以可以考虑羊向狼建边,,但流量是受图的限制的,所以把0也考虑进来,一次只向相邻的一格连边 直接跑dinic即可 ...

  5. 2017.3.25 最长递增子序列 失败总结

    主要被二分图匹配影响太深重了,竟没有用连续边反映问题(其实想过,只是觉得连续边没法控制长度..) 其实只要只让f[]为1的和为s的进行连边,保证出来的肯定就是s的....(没有充分利用dp) 另外这个 ...

  6. 2017.3.6~2017.3.7 Harry And Magic Box 思考记录(特别不容易)

    英文题,看翻译做 看到这个题竟然一下找到了思路:    组合数+容斥:: 但是容斥不太懂 好像要做这个题必须先推容斥.... 试一试吧. 然并卵,花了一个晚上,还是求不出来. 根据题目的重复关系,确实 ...

  7. 2017.9.2 最大半联通子图 思考记录

    这个题一看上去似乎很难,,   半联通子图根本就没听说过啊 但经过一段时间的思考之后似乎模型挺直接的. 但是其实,他就是问你一个选点最多的路径. 因为如果这些点如果不能能构成一条路径的话,不在路径上的 ...

  8. 2017.9.23 Count on a tree 思考记录

    这个题就是把区间第k大搬到了树上.. 于是想到链剖.但链剖是要支持区间合并的,第k大显然不可以合并,那怎么办呢 所以就可以容斥,,把所有重链起点终点用两个rt截下来,再把每个+和每个-离散下来,然后由 ...

  9. 2017.8.9 老C的键盘 思考记录

    这个题一开始想错了.  一开始本来打算每个点存三个值,一个比它大的数的个数,一个不确定的个数,一个比他小的个数.但这是把不同形态拆成不相关的几部分强行存到数组里,不能反映不同排列形态的关系,而且不确定 ...

最新文章

  1. java 为什么重写equals一定要重写hashcode?
  2. django html文本编辑器,django xadmin 集成DjangoUeditor富文本编辑器
  3. html5该怎么样学习?零基础入门HTML5学习路线
  4. Android手机用wifi连接adb调试的方法
  5. HTML5 Canvas和EaselJS入门(译)
  6. 利用Nginx对不同的域名进行解析
  7. html微软雅黑字体模糊,如何解决WinXP下微软雅黑字体不清晰的问题
  8. The Windows Phone Emulator wasn't able to create the external network switches 解决方法
  9. Machine Learning - XIII. Clustering聚类 (Week 8)
  10. java中example函数作用,MyBatis逆向工程中的Mapper接口以及Example的实例函数及详解...
  11. 引入Google新技术 Picasa2发布
  12. 毕业季海报设计素材图片大全,送给毕业生们最好的毕业季祝福语文案
  13. 1.1计算机解决问题的过程教案,1.1 计算机解决问题的过程
  14. VC2008+OpenCV2.3.1 的安装配置
  15. 74ls390设计任意进制计数器_《设计任意进制计数器》的实验报告
  16. 如何利用任意波形发生器创建你想要的波形并输出
  17. 微信支付后台接口开发(扫码版)
  18. Android网络代理原理及实现
  19. java 的简单代码_绝对最简单(Java代码)
  20. 一元三次多项式因式分解的两种方法

热门文章

  1. 韩顺平php视频笔记35 php运行过程
  2. R语言学习笔记(一)R语言的基本操作与函数
  3. 浮动和清浮动,内外边距和margin的坑
  4. android开发,加法,上课写的demo
  5. 安工大计算机学院肖维民,安工大路由器实验报告.docx
  6. 有监督学习和无监督学习_比监督学习做的更好:半监督学习
  7. mysql可扩展数据库_五大技巧提高MySQL可扩展性
  8. linux安装mysql5.6整套_Linux安装Mysql5.6
  9. 目前服务器操作系统版本,目前服务器操作系统版本号
  10. wifi 2.4g 5g 区别_关于路由器的2.4G以及5G,你不知道的那些事