2017.10.7 最长上升子序列 思考记录
由于他添加的数字单调上升,所以答案只会在插入的那个数的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 最长上升子序列 思考记录相关推荐
- 2017.10.8 球形空间产生器sphere 思考记录
圆心上的点到各点之间的距离相等,所以根据距离公式 sqrt ( (x-x1)^2 +(y-y1)^2 + (z-z1)^2) 可以由相邻两个式子列等式拆平方得到一元一次方程 然后消元求方程的解 ...
- 2017.10.17 CF#441 F题 思考记录
.果然没有题解做题感觉是不一样的. 这个F题可能是最像往常B题的题了(往常B题就是dp,还一般都不难) 首先这个是|,所以|的数越多,它一定是不降的 那么合法的一定是一个数到一个数往后的数所构成的所有 ...
- c语言找出递增子数组的长度,求给定数组的最长递增子序列(记录子序列的值)...
#include using namespace std; const int maxn = 100; int arr[maxn], dp[maxn], pre[maxn]; // pre记录前一个的 ...
- 2017.10.10 狼和羊的故事 思考记录
二集合划分问题,,花费最小,果断最小割 首先狼和羊可能会被分割,所以不能直接在原图上跑 所以可以考虑羊向狼建边,,但流量是受图的限制的,所以把0也考虑进来,一次只向相邻的一格连边 直接跑dinic即可 ...
- 2017.3.25 最长递增子序列 失败总结
主要被二分图匹配影响太深重了,竟没有用连续边反映问题(其实想过,只是觉得连续边没法控制长度..) 其实只要只让f[]为1的和为s的进行连边,保证出来的肯定就是s的....(没有充分利用dp) 另外这个 ...
- 2017.3.6~2017.3.7 Harry And Magic Box 思考记录(特别不容易)
英文题,看翻译做 看到这个题竟然一下找到了思路: 组合数+容斥:: 但是容斥不太懂 好像要做这个题必须先推容斥.... 试一试吧. 然并卵,花了一个晚上,还是求不出来. 根据题目的重复关系,确实 ...
- 2017.9.2 最大半联通子图 思考记录
这个题一看上去似乎很难,, 半联通子图根本就没听说过啊 但经过一段时间的思考之后似乎模型挺直接的. 但是其实,他就是问你一个选点最多的路径. 因为如果这些点如果不能能构成一条路径的话,不在路径上的 ...
- 2017.9.23 Count on a tree 思考记录
这个题就是把区间第k大搬到了树上.. 于是想到链剖.但链剖是要支持区间合并的,第k大显然不可以合并,那怎么办呢 所以就可以容斥,,把所有重链起点终点用两个rt截下来,再把每个+和每个-离散下来,然后由 ...
- 2017.8.9 老C的键盘 思考记录
这个题一开始想错了. 一开始本来打算每个点存三个值,一个比它大的数的个数,一个不确定的个数,一个比他小的个数.但这是把不同形态拆成不相关的几部分强行存到数组里,不能反映不同排列形态的关系,而且不确定 ...
最新文章
- java 为什么重写equals一定要重写hashcode?
- django html文本编辑器,django xadmin 集成DjangoUeditor富文本编辑器
- html5该怎么样学习?零基础入门HTML5学习路线
- Android手机用wifi连接adb调试的方法
- HTML5 Canvas和EaselJS入门(译)
- 利用Nginx对不同的域名进行解析
- html微软雅黑字体模糊,如何解决WinXP下微软雅黑字体不清晰的问题
- The Windows Phone Emulator wasn't able to create the external network switches 解决方法
- Machine Learning - XIII. Clustering聚类 (Week 8)
- java中example函数作用,MyBatis逆向工程中的Mapper接口以及Example的实例函数及详解...
- 引入Google新技术 Picasa2发布
- 毕业季海报设计素材图片大全,送给毕业生们最好的毕业季祝福语文案
- 1.1计算机解决问题的过程教案,1.1 计算机解决问题的过程
- VC2008+OpenCV2.3.1 的安装配置
- 74ls390设计任意进制计数器_《设计任意进制计数器》的实验报告
- 如何利用任意波形发生器创建你想要的波形并输出
- 微信支付后台接口开发(扫码版)
- Android网络代理原理及实现
- java 的简单代码_绝对最简单(Java代码)
- 一元三次多项式因式分解的两种方法
热门文章
- 韩顺平php视频笔记35 php运行过程
- R语言学习笔记(一)R语言的基本操作与函数
- 浮动和清浮动,内外边距和margin的坑
- android开发,加法,上课写的demo
- 安工大计算机学院肖维民,安工大路由器实验报告.docx
- 有监督学习和无监督学习_比监督学习做的更好:半监督学习
- mysql可扩展数据库_五大技巧提高MySQL可扩展性
- linux安装mysql5.6整套_Linux安装Mysql5.6
- 目前服务器操作系统版本,目前服务器操作系统版本号
- wifi 2.4g 5g 区别_关于路由器的2.4G以及5G,你不知道的那些事