Rinne Loves Data Structure
这个题用一波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相关推荐
- 牛客小白月赛11:Rinne Loves Data Structure
Rinne Loves Data Structure 思路 我们插入的位置大概分了四种: 第一种 显然我们找到比当前插入的值的pre,也就是比当前节点大的最小值. 第二种 我们只要找到当前节点的suc ...
- LeetCode Two Sum III - Data structure design
原题链接在这里:https://leetcode.com/problems/two-sum-iii-data-structure-design/ 题目: Design and implement a ...
- c语言cin n1 n2,牛客等级之题N1 追债之旅 - N2 Rinne Loves Study(8.6场)
牛客等级之题N1-A.追债之旅(8.6场) 题目描述 小明现在要追讨一笔债务,已知有n座城市,每个城市都有编号,城市与城市之间存在道路相连(每条道路都是双向的),经过任意一条道路需要支付费用.小明一开 ...
- leetcode 211. Add and Search Word - Data structure design Trie树
题目链接 写一个数据结构, 支持两种操作. 加入一个字符串, 查找一个字符串是否存在.查找的时候, '.'可以代表任意一个字符. 显然是Trie树, 添加就是正常的添加, 查找的时候只要dfs查找就可 ...
- leetcode Add and Search Word - Data structure design
我要在这里装个逼啦 class WordDictionary(object):def __init__(self):"""initialize your data str ...
- TRIE - Data Structure
Introduction 介绍 Trie,又称单词查找树,是一种树形结构,用于保存大量的字符串.它的优点是:利用字符串的公共前缀来节约存储空间. Trie is an ordered tree dat ...
- HDU - 7072 Boring data structure problem 双端队列 + 思维
传送门 文章目录 题意: 思路: 题意: 你需要实现如下四个操作 q≤1e7q\le1e7q≤1e7 思路: 做的时候想了个链表的思路让队友写了,懒. 看了题解感觉题解还是很妙的. 你需要快速插入一个 ...
- HDU - 6967 G I love data structure 线段树维护矩阵 + 细节
传送门 文章目录 题意: 思路: 题意: 给你两个长度为nnn的数组a,ba,ba,b,你需要完成如下四种操作: 思路: 思路还是比较简单的,首先建一颗线段树,线段树中维护a,b,a2,b2,aba, ...
- Rinne Loves Edges
Rinne Loves Edges 题意: 有n给点,m个边,每个边有边权,给你一个点S,问最少花多少代价,可以让叶子节点无法与S点连通 题解: dp[u]:表示u到叶子节点的最短费用的和 dp[u] ...
最新文章
- ztree.js的使用整理
- web---jsp连接数据库
- Powershell AWS 自动化管理 (6) - IAM
- RabbitMQ 消息确认机制confirm代码编写
- Python 浅拷贝和深拷贝 - Python零基础入门教程
- sqlserver 常用存储过程集锦
- MyEclipse开发JAX-RS架构WebServices收发JSON数据格式
- Atitit 软件体系的进化,是否需要一个处理中心
- linux内核默认imx6速率配置,Linux4.1.15内核移植-imx6ull
- YUV和RGB格式分析
- textbox提示文字属性_《我来自江湖》MUD类武侠题材多样性玩法的单机文字游戏...
- Mac系统下不能直接往移动硬盘里面拷贝东西,用Mounty之后硬盘打不开,怎么办?
- springboot 连接并操作redis 完全可用的
- python异步爬虫教程_tornado异步请求非阻塞|python爬虫|python入门|python教程
- 按分数段统计学生人数python_用Excel统计各分数段学生数
- Unity 学习 Tilemap
- 用c语言验证5阶魔方矩阵,穷举法打印n阶魔方矩阵
- python绘制蚊香形_Python requests发送post请求的一些疑点
- 【iOS-Cocos2d游戏开发之二】Cocos2D 游戏开发资源贴(教程以及源码)
- 60行代码爬取知乎神回复