清北学堂-D7-T1-bst

2024-02-05 15:18
文章标签 学堂 t1 bst 清北 d7

本文主要是介绍清北学堂-D7-T1-bst,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这里写图片描述
这里写图片描述
这个题暴力给了50分,直接模拟即可。
为什么是50分呢?有些人会有这个疑问。
原因很简单,你可以模拟一下这组数据:
10
1 2 3 4 5 6 7 8 9 10
你可以发现,如果我给你你个递增序列,你的算法就会被卡到 O(n2)
那这个题怎么做呢?
我这里介绍两个做法,都不是std
1.某位大佬的倍增
我们可以插入的时候更新每个点 i 向下跳2j步的目标点,然后插入时倍增地去插入,这个算法可以过。
2.我的算法:分治+ST表
怎么做呢?
我们手玩一下样例,发现隐隐约约有点规律,可是也看不出来。
然后我就发现bst的中序遍历正好就是排序后的序列,可是为什么形态会不同呢?
我们可以发现,现在所有因素都确定了,除了插入顺序!
我们把所有数按插入顺序标号,然后按值的大小排序,再次模拟插入的过程,并把树上的节点标上插入顺序的标号,我们现在再次观察整棵树的性质,可以发现我们按插入顺序来看,整棵树就是个小根堆,这样一来算法就显而易见了。
首先读入所有数,排序。
然后我们可以每次找到一个序列中插入顺序最小的数,将其的深度设为父亲节点深度加一,然后递归地去处理左右边,这样算法的时间复杂度就是查询的时间复杂度了,我们可以用ST表,可以做到 O(nlogn) 预处理, O(n) 建树,然后再 O(n) 累加,输出即可。
然后我就愉快地爆栈了,被卡到暴力分50,原因是我们这样递归的话在极端情况下会递归n层,然后n是 3105 ,但是栈大小大约只有 105 ,就会爆。
处理方法也很简单,我们只要用bfs来处理就可以了,具体可以看我的代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<queue>
#define ll long long
using namespace std;
inline int read(){int x=0;char ch=' ';int f=1;while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();if(ch=='-')f=-1,ch=getchar();while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();return x*f;
}
int id[300001];
int n;
int a[300001];
int mp[300001];
int st[20][300001];
int Log[300001];
inline int query(int l,int r){int k=Log[r-l+1];return min(st[k][l],st[k][r-(1<<k)+1]);
}
int dep[300001];
ll ans[300001];
queue<int> ql,qmid,qr;
void solve1(){int start=query(1,n);ql.push(1);qmid.push(mp[start]);qr.push(n);while(!ql.empty()){int l=ql.front();int mid=qmid.front();int r=qr.front();ql.pop();qmid.pop();qr.pop();if(l>=r)continue;if(mid>l){int mn=query(l,mid-1);dep[mp[mn]]=dep[mid]+1;ql.push(l);qmid.push(mp[mn]);qr.push(mid-1);}if(mid<r){int mn=query(mid+1,r);dep[mp[mn]]=dep[mid]+1;ql.push(mid+1);qmid.push(mp[mn]);qr.push(r);}}
}
int main(){freopen("bst.in","r",stdin);freopen("bst.out","w",stdout);n=read();Log[0]=-1;for(int i=1;i<=n;i++){Log[i]=Log[i>>1]+1;}for(int i=1;i<=n;i++){a[i]=read();id[a[i]]=i;}for(int i=1;i<=n;i++){st[0][i]=id[i];mp[id[i]]=i;}for(int k=1;k<=19;++k){for(int i=1;i+(1<<k)-1<=n;++i){st[k][i]=min(st[k-1][i],st[k-1][i+(1<<(k-1))]);}}solve1();for(int i=1;i<=n;i++){ans[n]+=dep[i];}for(int i=n-1;i>=1;i--){ans[i]=ans[i+1]-dep[mp[i+1]];}for(int i=1;i<=n;i++){printf("%I64d\n",ans[i]);}return 0;
}

这篇关于清北学堂-D7-T1-bst的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/681320

相关文章

T1打卡——mnist手写数字识别

🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 1.定义GPU import tensorflow as tfgpus=tf.config.list_physical_devices("GPU")if gpus:gpu0=gpus[0]tf.config.experimental.set_memort_groth(gpu0,True) #设置GPU现存用量按需

深入理解二叉搜索树(BST)

一棵二叉搜索树(BST)是以一棵二叉树来组织的,可以用链表数据结构来表示,其中,每一个结点就是一个对象,一般地,包含数据内容key和指向孩子(也可能是父母)的指针属性。如果某个孩子结点不存在,其指针属性值为空(NIL)。 二叉搜索树中的关键字key的存储方式总是满足二叉搜索树的性质: 设x是二叉搜索树中的一个结点。如果y是x左子树中的一个结点,那么会有y.key<=x.key;如果y是x右子树

Add, Search, Delete Node in BST.

Add Node, Search Node, Delete Node, 的基本操作,被问了两次了。写出来。 http://quiz.geeksforgeeks.org/binary-search-tree-set-1-search-and-insertion/   // add the node;public TreeNode addNode(TreeNode root, int val)

BST二叉搜索树的几个操作

Binary Srearch Tree:二叉排序树、二叉搜索树(重点在search) (一)用BST进行查找 代码1:用BST进行查找(递归版本):思路与二分查找很像 //使用BST查找:递归版本BSTNode * BST_Search(BiTree T,ElemType key){if(T==nullptr) return ;if(key==T->root){return T->root

深入理解二叉搜索树(BST)与节点查找:递归与迭代的多角度分析

深入理解二叉搜索树(BST)与节点查找:递归与迭代的多角度分析 二叉搜索树(BST) 是计算机科学中一种常见的数据结构,它通过在二叉树的基础上增加有序性约束,使得查找、插入和删除操作能够在平均情况下达到 O(log n) 的时间复杂度。因此,BST 被广泛应用于各种需要高效查找的数据结构中,如符号表、优先队列等。 本文将从基本概念出发,详细分析如何在 BST 中查找节点,并通过递归和迭代两种方

精通推荐算法26:行为序列建模之BST— Transformer建模用户行为序列

1 行为序列建模算法架构 2 BST背景 DIEN利用GRU循环神经网络来建模用户行为序列,捕获了用户行为的演变过程,以及行为间的相关关系,取得了非常不错的业务效果。但受制于GRU天然的串行计算方式,存在长程序列梯度弥散、串行计算影响速度等问题。在自然语言处理领域,Transformer自2017年提出以来,就席卷了整个行业,并在2018年BERT上线后大放异彩。2022年底火遍全球的Ch

肾虚学习实验第T1周:实现mnist手写数字识别

>- **🍨 本文为[🔗365天深度学习训练营](https://mp.weixin.qq.com/s/0dvHCaOoFnW8SCp3JpzKxg) 中的学习记录博客**>- **🍖 原作者:[K同学啊](https://mtyjkh.blog.csdn.net/)** 目录 一、前言 作为一名研究牲,一定要了解pytorch和tensorflow。下面我来介绍一下。 Ten

449. Serialize and Deserialize BST

经典题目之一,二叉树的遍历和深度广度优先都相关。 一般的binary tree的serialization 和 deserialization 相对麻烦一点,因为没有多余特征可以利用。但binary search tree就有重要的大小关系可以利用。或者说,binary tree的恢复,往往需要preorder 和inorder两个序列,或者postorder和inorder。但是binary s

Minimum Absolute Difference in BST问题及解法

问题描述: Given a binary search tree with non-negative values, find the minimum absolute difference between values of any two nodes. 示例: nput:1\3/2Output:1Explanation:The minimum absolute differenc

Convert BST to Greater Tree问题及解法

问题描述: Given a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original BST is changed to the original key plus sum of all keys greater than the original key in BST.