这个题用一波FHQ Treap做,不用STL了,正好检验一波手搓的无旋Treap怎么样。

题解:这个题插入操作跟普通的二叉树是相同的,让你找一个数的前序和后继,如果我们用普通的BST,势必会T到天上去,一条链足以卡飞BST,这里用了一波FHQ Treap无旋平衡树来写这个题。
很感谢这个题的输入的数据范围是大于1小于某个数(只知道小于1e6)(参考了zzugzx大佬的想法),所以就可以免去再做一写别的操作了。
我们设置一个最大值一个最小值,目的是为了保证他有前驱和后继,因为你插入一个值,会有4种情况。
1.前驱后继都有
2.有前驱没用后继
3.有后继没有前驱
4.没有后继也没有前驱
所以我们插入一个比较大的值和一个比较小的值,以确保每次插入的值都有前驱和后继,这样的话在我们每次找前驱后继都很方便了。
至于这个FHQ Treap的实现,代码中都写有注释了。

/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
const int maxn = 11100;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 100000000;
using namespace std;int cnt,root;
mt19937 rnd(233);  //随机数
struct Node{int l,r,val,key,size;
}fhq[1000010];
int newnode(int val){  //开辟新结点fhq[++cnt].val=val;fhq[cnt].key=rnd();fhq[cnt].size=1;return cnt;   //直接返回一个新结点
}void update(int now){  //push_up更新节点大小(当加入了新结点)fhq[now].size=fhq[fhq[now].l].size+fhq[fhq[now].r].size+1;
}
void spilt(int now,int val,int &x,int &y){ //分裂乘两棵树if(!now) x=y=0;  //如果是一颗空树,直接返回x,y是空树即可else{if(fhq[now].val<=val){  //这里是按值分裂把小于等于val值得分到x树,大于val得分到y树x=now; //这个值左孩子上得所有结点都属于x这棵树spilt(fhq[now].r,val,fhq[now].r,y);//右孩子上大部分都会大于这个值,//也有可能会有小于val这个值得,所以我们要继续递归右子树进行查找}else{y=now;   //复读机spilt(fhq[now].l,val,x,fhq[now].l);}update(now);}
}
int merge(int x,int y){   //把两棵树合并起来if(!x||!y) return x+y;if(fhq[x].key>fhq[y].key){   //既要符合堆得性质,又要符合搜索树得性质//我们知道x这棵树上得值全都小于y这颗树上得值,// 所以当x得key大于y这个key得时候,y在x得右下方(既要在右边,也要在下面)//所以让x得右子树跟y合并fhq[x].r=merge(fhq[x].r,y);update(x);return x;}else{fhq[y].l=merge(x,fhq[y].l);update(y);return y;}
}
int x,y,z;
void insert(int val){  //插入某值spilt(root,val,x,y);  //先把树按照val值分裂开//因为x树都小于等于val,所以我们直接让新结点跟x合并起来//再把x树跟y树合并起来root=merge(merge(x,newnode(val)),y);
}
int pre(int val){   //找前驱,按照val-1分裂此树//在他前面的哪个数,一定是在x树上的最右端(最大值)spilt(root,val-1,x,y);int now=x;while (fhq[now].r) now=fhq[now].r;int temp=fhq[now].val;root=merge(x,y);return temp;
}
int nxt(int val){//找后继,按照val分裂此树//在他后面的树一定是y树上最左边的值(最小值)spilt(root,val,x,y);int now=y;while (fhq[now].l) now=fhq[now].l;int temp=fhq[now].val;root=merge(x,y);return temp;
}
inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();return s*w;
}
int deep[1000010];
int main() {int n;cin>>n;insert(1000000),insert(0);deep[1000000]=deep[0]=-1;long long ans=0;while(n--){int v;v=read();deep[v]=max(deep[pre(v)],deep[nxt(v)])+1;insert(v);ans+=deep[v];printf("%lld\n",ans);}return 0;
}

Rinne Loves Data Structure相关推荐

  1. 牛客小白月赛11:Rinne Loves Data Structure

    Rinne Loves Data Structure 思路 我们插入的位置大概分了四种: 第一种 显然我们找到比当前插入的值的pre,也就是比当前节点大的最小值. 第二种 我们只要找到当前节点的suc ...

  2. LeetCode Two Sum III - Data structure design

    原题链接在这里:https://leetcode.com/problems/two-sum-iii-data-structure-design/ 题目: Design and implement a ...

  3. c语言cin n1 n2,牛客等级之题N1 追债之旅 - N2 Rinne Loves Study(8.6场)

    牛客等级之题N1-A.追债之旅(8.6场) 题目描述 小明现在要追讨一笔债务,已知有n座城市,每个城市都有编号,城市与城市之间存在道路相连(每条道路都是双向的),经过任意一条道路需要支付费用.小明一开 ...

  4. leetcode 211. Add and Search Word - Data structure design Trie树

    题目链接 写一个数据结构, 支持两种操作. 加入一个字符串, 查找一个字符串是否存在.查找的时候, '.'可以代表任意一个字符. 显然是Trie树, 添加就是正常的添加, 查找的时候只要dfs查找就可 ...

  5. leetcode Add and Search Word - Data structure design

    我要在这里装个逼啦 class WordDictionary(object):def __init__(self):"""initialize your data str ...

  6. TRIE - Data Structure

    Introduction 介绍 Trie,又称单词查找树,是一种树形结构,用于保存大量的字符串.它的优点是:利用字符串的公共前缀来节约存储空间. Trie is an ordered tree dat ...

  7. HDU - 7072 Boring data structure problem 双端队列 + 思维

    传送门 文章目录 题意: 思路: 题意: 你需要实现如下四个操作 q≤1e7q\le1e7q≤1e7 思路: 做的时候想了个链表的思路让队友写了,懒. 看了题解感觉题解还是很妙的. 你需要快速插入一个 ...

  8. HDU - 6967 G I love data structure 线段树维护矩阵 + 细节

    传送门 文章目录 题意: 思路: 题意: 给你两个长度为nnn的数组a,ba,ba,b,你需要完成如下四种操作: 思路: 思路还是比较简单的,首先建一颗线段树,线段树中维护a,b,a2,b2,aba, ...

  9. Rinne Loves Edges

    Rinne Loves Edges 题意: 有n给点,m个边,每个边有边权,给你一个点S,问最少花多少代价,可以让叶子节点无法与S点连通 题解: dp[u]:表示u到叶子节点的最短费用的和 dp[u] ...

最新文章

  1. ztree.js的使用整理
  2. web---jsp连接数据库
  3. Powershell AWS 自动化管理 (6) - IAM
  4. RabbitMQ 消息确认机制confirm代码编写
  5. Python 浅拷贝和深拷贝 - Python零基础入门教程
  6. sqlserver 常用存储过程集锦
  7. MyEclipse开发JAX-RS架构WebServices收发JSON数据格式
  8. Atitit 软件体系的进化,是否需要一个处理中心
  9. linux内核默认imx6速率配置,Linux4.1.15内核移植-imx6ull
  10. YUV和RGB格式分析
  11. textbox提示文字属性_《我来自江湖》MUD类武侠题材多样性玩法的单机文字游戏...
  12. Mac系统下不能直接往移动硬盘里面拷贝东西,用Mounty之后硬盘打不开,怎么办?
  13. springboot 连接并操作redis 完全可用的
  14. python异步爬虫教程_tornado异步请求非阻塞|python爬虫|python入门|python教程
  15. 按分数段统计学生人数python_用Excel统计各分数段学生数
  16. Unity 学习 Tilemap
  17. 用c语言验证5阶魔方矩阵,穷举法打印n阶魔方矩阵
  18. python绘制蚊香形_Python requests发送post请求的一些疑点
  19. 【iOS-Cocos2d游戏开发之二】Cocos2D 游戏开发资源贴(教程以及源码)
  20. 60行代码爬取知乎神回复

热门文章

  1. NLTK包和语料库的准备
  2. 爬虫之数据提取响应内容的分类
  3. 一文读懂CV中的注意力机制
  4. 是时候了解下无监督学习了!
  5. 经验 | 深度学习优化背后的数学基础
  6. 引用次数在 19000 次+的,都是什么神仙论文?
  7. 干货|你的Paper阅读能力合格了吗(硕士生版)
  8. 用于自动驾驶的实时车道线检测和智能告警
  9. 如何用node开发自己的cli工具
  10. 阿里云面向企业效率的云上产品全解析——云呼叫中心