首页 > 其他分享 >STL中的set——洛谷P5250

STL中的set——洛谷P5250

时间:2024-03-13 22:32:13浏览次数:25  
标签:bf set 洛谷 STL 元素 bound len end se

 1.作用 / 与优先队列的区别

(1)插入一个元素,自动排序,保证其内部元素有序(升序)。优先队列也可以做到这一点。

(2)支持任意增删一个元素,而优先队列做不到这一点,这是两者其中一个区别。

(3)使用set的前提是唯一键值对,保证了其内部没有重复元素,而优先队列内部同一元素可以有多个,这是两者第二个区别。

2.常用操作

set<int> se;     //以int型为例 默认按键值升序
set<int,greater<int>> se;  //降序排列 

int x;

q.insert(x);	//插入元素x,若x已存在,则什么都不干
q.find(x);		//在q中查找x,返回x的迭代器,若x不存在,则返回指向q尾部的迭代器即 q.end()

q.erase(x);		//删除元素x,若x不存在,则什么都不干
q.erase(it)     //删除集合中地址为it的元素
q.clear();		//清空集合

q.size();		//返回集合se中元素的个数
q.empty();		//判断se是否为空,若是返回1,否则返回0

q.lower_bound(x); //返回一个迭代器,指向第一个键值不小于x的元素,若这个数不存在,则返回se.end()
q.upper_bound(x); //返回一个迭代器,指向第一个键值大于x的元素,若这个数不存在,则返回se.end()

q.begin();		  //返回指向se中第一个元素的迭代器
q.end();		 //返回指向se最后一个元素下一个位置的迭代器 ( 这是一个空指针 ),这个方法很少直接使用,一般是配合其他操作判断某个元素是否存在

3.核心代码片段分析

else                //若是删除操作,且集合不为空
{
    set<int> :: iterator it = se.lower_bound(len),bf=it;

    //也可写成
      set<int> :: iterator it,bf;
      it = se.lower_bound(len);
      bf=it;
	

if (bf!=se.begin())
	bf--;

//若*it不是第一个元素,则bf(before)表示前一个元素
//不能写成bf=it-1,bf和it都是指针类型

if (it!=se.end() && len-(*bf)>(*it)-len)
	bf=it;

//举个例子,集合中元素是1 3 5 7,查找的是 9,根据定义“q.lower_bound(x); //返回一个迭代器,
指向第一个键值不小于x的元素,若这个数不存在,则返回se.end()”,因为不存在,所以返回的是se.end(),
就是7后面的那个空指针,这时不能够对it解引用。

cout<<*bf<<endl;
se.erase(*bf);

//最终输出的是*bf
//千万别忘删除这个元素

#使用lower_bound和upper_bound要注意特判首尾

4.完整代码

#include<iostream>
#include<algorithm>
#include<set>
using namespace std;

int n,opt,len,w1,w2;
set<int> se;

int main()
{
	int i;
	cin>>n;
	while (n--)
	{
		cin>>opt>>len;
		if (opt==1)
		{
			if (se.find(len)!=se.end())
				cout<<"Already Exist"<<endl;
			else 
				se.insert(len);
		}
		else 
		{
			if (se.empty())
				cout<<"Empty"<<endl;
			else 
			{
				set<int> :: iterator it = se.lower_bound(len),bf=it;
				if (bf!=se.begin())
					bf--;
				if (it!=se.end() && len-(*bf)>(*it)-len)
					bf=it;
				cout<<*bf<<endl;
				se.erase(*bf);
			}
		}
	}
	return 0;
}

标签:bf,set,洛谷,STL,元素,bound,len,end,se
From: https://blog.csdn.net/2301_81608637/article/details/136586466

相关文章

  • 字符串哈希——洛谷P3370
    1.简介本文主要介绍三种实现哈希表的方法:进制哈希,set哈希,map哈希。2.进制哈希#include<iostream>#include<vector>#definemod1000usingnamespacestd;intn,hs,ans;vector<string>a[mod];//数组开多大,取决于mod取多大strings;......
  • 二分+前缀和——洛谷P1314
    1.公式解读[...]  括号内内容为真则其值等于1,内容为假则其值等于0 2.思路这是一个关于单调性判定的问题,当W不断增大,差值由大变小再变大(实际是从负到0到正,只不过要取绝对值,不影响它的单调性),而目标则是在0的附近找到一个绝对值最小的值,因此是一道二分答案题,但如果......
  • 洛谷P6866 [COCI2019-2020#5] Emacs
    题目描述给定一个n×m 的只含有 . 和 * 的矩阵。矩阵中 * 形成一些不重叠的长方形。它们不在边缘或顶点接触。求长方形有多少个?输入格式第一行:两个正整数 n 和 m。以下 n 行:表示题目描述中的矩阵。矩阵只含有 . 和 *。输出格式一行一个非负整数,你的答......
  • C++:[NWRRC2015] Concatenation(洛谷)P7050
    题目描述FamousprogrammerGennadylikestocreatenewwords.Onewaytodoitistoconcatenateexistingwords.Thatmeanswritingonewordafteranother.Forexample,ifhehaswords cat and dog,hewouldgetaword catdog,thatcouldmeansomething......
  • 洛谷 P2730 魔板 题解 DFS(广度优先搜索)
    题目背景在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板。这是一张有 8 个大小相同的格子的魔板:12348765题目描述我们知道魔板的每一个方格都有一种颜色。这 8 种颜色用前 8 个正整数来表示。可以用颜色的序列来表示一种魔板状态,规定从魔板的左......
  • 生物分子体系结构预测开源模型RoseTTAFold All-Atom的conda环境部署及使用
    欢迎浏览我的CSND博客!Blockbuater_drug…点击进入文章目录前言一、RoseTTAFoldAll-Atom(RFAA)是什么?二、安装步骤1.安装mamba(非必须的,conda也可以)2.下载RoseTTAFold-All-Atom3.创建conda环境并安装4.安装SE3T5.准备cs-blast6.安装signalp67.下载序列和模板......
  • 模板匹配——set_shape_model_clutter
    通过设置杂波,来准确定位要检测对象;如下图中未设置杂波情况下,匹配结果如(3);如图(4)设置杂波后,匹配结果如图(5)**Createashapemodel.*创建一个模型read_image(ImageModel,'/bga_gap/bga_gap_01.png')gen_circle(ROI,753.869,551.624,28.4027)reduce_domain(Image......
  • 模版匹配——set_shape_model_param
    1.'min_contrast'最小对比度SetstheminimumcontrastoftheobjectinthesearchimagesfortheshapemodelModelID.Thereby,thevalueof'min_contrast'thatwasoriginallyset,e.g.withcreate_shape_model,isoverwrittenfortheshape......
  • setvbuf缓冲的使用
    平时我们在写文件的时候,iofstream也好,fwrite也罢,写文件到磁盘,刷新、落盘,这样就完成了一次磁盘IO交互;当出现高并发,多个线程都在写磁盘的时候,就可能出现磁盘IO瓶颈,如图,写等待的时间就会很长,这将一定程度阻塞程序的运行或者影响正常存储:#iostat-x-d/dev/sda-m1针对这种问题......
  • 洛谷题单指南-二叉树-P4715 【深基16.例1】淘汰赛
    原题链接:https://www.luogu.com.cn/problem/P4715题意解读:计算亚军得主,注意能力值最高的肯定是冠军,但能力值第二高的不一定是亚军,因为有可能中途就遭遇冠军。解题思路:根据题意,两两比赛,一轮后再按顺序两两比赛,形如一棵二叉树,但解题其实用不到二叉树的数据结构可以看出,最后参与......