洛谷P5076 【深基16.例7】普通二叉树(简化版)c嘎嘎

题目链接P5076 【深基16.例7】普通二叉树(简化版) - 洛谷 | 计算机科学教育新生态

题目难度普及+/提高

解题思路 :本题运用了STL 中的multiset ,它可以看成一个序列,插入一个数,删除一个数都能够在O(logn)的时间内完成,而且他能时刻保证序列中的数是有序的,而且序列中可以存在重复的数(区别于set是不能有重复元素), 首先解决这道题用到了lower_bound(返回元素值为X的第一个可安插位置,也就是元素值 >=X的第一个元素位置)和upper_down(返回元素值为X 的最后一个可安插位置,也就是元素值 > X 的第一个元素位置)函数,还有multiset的迭代器(multiset<int>::iterator)

常用函数:

复制代码
multiset<int>q;
//定义一个multiset,尖括号里写类型
//如果是自定义类型,需要重载小于号 

q.insert(x);
//插入一个数 x 

q.clear();
//清空 

q.erase(x);
//删除容器中的所有值为 x 的数 

q.erase(it);
//删除容器中迭代器it指向的元素 

q.empty();
//返回bool值,如果容器为空返回true,否则返回false 

q.size()
//返回元素个数

q.begin();
//返回首个元素的迭代器 

q.end();
//返回最后一个元素的下一个位置的迭代器 

q.count(x);
//返回容器中 x 的个数 

q.find(x);
//返回容器中第一个x的位置(迭代器),如果没有就返回q.end() 

q.lower_bound(x);
//返回容器中第一个大于等于x的数的迭代器 

q.upper_bound(x);
//返回容器中第一个大于x的数的迭代器

代码部分:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 110; 
multiset<int>m;
int q,op,x;
int rank1;//记录该数的排位 

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    
    cin >> q;
    m.insert(-0x7fffffff);
    m.insert(0x7fffffff);//提前放入这两个数 
    
    while(q--)
    {
    	cin >> op >> x;
    	if(op == 1)
    	{
    		auto now = m.lower_bound(x);//返回迭代器 now取得是x的位置 
    		//可以写作multiset<int>::iterator,因为lower_bound方法返回的是迭代器
    		rank1 = 0;
    		for(auto i = m.begin(); i != now; i++,rank1++);//切记要加分号 
    		
    		cout<<rank1<<'\n';//输出排名 
		}
		else if(op == 2)
		{
			rank1 = -1;//前面还有个0x7f7f7f7f7 
			
			for(int i:m)
			{
				if(++rank1 == x) cout<<i<<'\n';
			}
			/*也可以这样遍历 
                for(multiset<int>::iterator i=m.begin();i!=m.end();i++)
                {
                    rank1++;
                    if(rank1==x)
                        cout<<i<<'\n';
                }
            */
		}
		else if(op == 3)
		{
			auto now = m.lower_bound(x);
			
			cout << *--now <<'\n'; //因为是迭代器(指针),所以输出前面加 *
			//由于我们要取得前驱,所以now要自减一
		}
		else if(op == 4)
		{
			cout<<*m.upper_bound(x)<<'\n'; //因为是迭代器(指针),所以输出前面加 *
		}
		else
		{
			m.insert(x);
		}
	}
	 
    return 0;
}
相关推荐
艾斯比的日常2 分钟前
Java 三色标记算法:并发垃圾回收的核心技术解析
java·开发语言·算法
2501_9411444212 分钟前
Python + C++ 异构微服务设计与优化
c++·python·微服务
CoovallyAIHub13 分钟前
抛弃LLM!MIT用纯视觉方法破解ARC难题,性能接近人类水平
深度学习·算法·计算机视觉
程序猿编码17 分钟前
PRINCE算法的密码生成器:原理与设计思路(C/C++代码实现)
c语言·网络·c++·算法·安全·prince
高洁0129 分钟前
具身智能-视觉语言导航(VLN)
深度学习·算法·aigc·transformer·知识图谱
Croa-vo34 分钟前
TikTok 数据工程师三轮 VO 超详细面经:技术深挖 + 建模推导 + 压力测试全记录
javascript·数据结构·经验分享·算法·面试
蘑菇小白42 分钟前
时间复杂度
数据结构·算法
czlczl200209251 小时前
算法:组合问题
算法·leetcode·职场和发展
CoderYanger1 小时前
优选算法-字符串:63.二进制求和
java·开发语言·算法·leetcode·职场和发展·1024程序员节
charlie1145141911 小时前
深入理解C/C++的编译链接技术6——A2:动态库设计基础之ABI设计接口
c语言·开发语言·c++·学习·动态库·函数