首页 > 其他分享 >set中的查找操作

set中的查找操作

时间:2023-11-25 15:44:52浏览次数:26  
标签:opt set orz int bound pps 查找 操作

P05523. ycz的set

Description
pps就给你出了一道set入门题,他觉得你做出来了就代表你的set真正入门了。

由于pps太神了,所以你根本不敢反驳,只能老老实实地做出这题。而且pps表示,如果你不能在1s之内给出答案,pps将不会保你AK IOI

Format
Input
第一行为n,代表操作的个数

之后的n行,每行两个数opt,x

如果opt=1,那么请你在set中插入数x,如果数列中已经有x了,那么输出"orz pps,the number has appeared"

如果opt=2,那么请你在set中删除数x,如果数列中没有x,那么输出"orz pps,we don't have this number"

如果opt=3,那么请你输出在set中小于x的数的最大值,如果没有小于x的数,那么输出"orz pps,pps AK NOI"

如果opt=4,那么请你输出在set中大于x的数的最小值,如果没有大于x的数,那么输出"orz pps,pps AK IOI"

(输出orz时不需要输出引号).

n<=1e5,x<=1e9

Output
对于每个询问操作,输出对应的答案

Samples
输入数据 1
10
1 5
1 2
2 3
1 8
3 8
4 2
1 9
1 5
2 9
4 9
输出数据 1
orz pps,we don't have this number
5
5
orz pps,the number has appeared
orz pps,pps AK IOI

 

Sol:此题考察学生对lower_bound(),upper_bound()相关操作的理解与变通

对于此类题,通常可在set中事先加入两个数字代表极小与极大值。

#include<bits/stdc++.h>
using namespace std;
const int inf=2147483647;
set<int>s;
int main(){
	int n;
	scanf("%d",&n);
	s.insert(inf);
	s.insert(-inf);
	while(n--)
	{
		int opt,x;
		scanf("%d %d",&opt,&x);
		if(opt==1)
		{
			if(s.count(x))
				printf("orz pps,the number has appeared\n");
			else
				s.insert(x);
		}
	    if(opt==2)
		{
			if(!s.count(x))
				printf("orz pps,we don't have this number\n");
			else
				s.erase(s.lower_bound(x));
		}
		if(opt==3)
		//在set中小于x的数的最大值
		{
			auto it=--s.lower_bound(x);
			if(*it==-inf)
			//找到的结果为-inf,说明是不存在的 
				printf("orz pps,pps AK NOI\n");
			else
				printf("%d\n",*it);
		}
		if(opt==4)
		//输出在set中大于x的数的最小值
		{
			auto it=s.upper_bound(x);
			if(*it==inf)
			//找到的结果为inf,说明是不存在的 
				printf("orz pps,pps AK IOI\n");
			else
				printf("%d\n",*it);
		}
	}
	
	return 0;
}

  

 

P01465. 邻值查找2

Description
输入一个数列。 就是每插入一个,找到前面插入过的与之差最小的值,将他们的差值加入答案

Format
Input
第一行为正整数N ,接下来的n行每行有一个正整数

N≤32767,每个数字≤1,000,000。

Output
如题

Samples
输入数据 1
6
5
1
2
5
4
6
输出数据 1
12
HINT 结果说明:5+|1-5|+|2-1|+|5-5|+|4-5|+|6-5|=5+4+1+0+1+1=12

 

Sol:此题与上一题类似,只是注意会涉及一些加减法操作,所以数据类型不要过界了

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+7;
int a[N];
set<int>s;
main()
{
	int n,w;
	long long sum=0;
	cin>>n;
	cin>>w;
	s.insert(1<<30);
	s.insert(-1<<30);
//这里用正负1<<30代表极大极小值 s.insert(w); sum+=w; for(int i=2;i<=n;i++) { int p; cin>>p; int x=*s.lower_bound(p); int y=*(--s.lower_bound(p)); // cout<<"find it "<<x<<" "<<y<<endl; // cout<<x-p<<" "<<p-y<<endl; s.insert(p); sum+=min((x-p),(p-y)); } cout<<sum<<endl; return 0; }

  

标签:opt,set,orz,int,bound,pps,查找,操作
From: https://www.cnblogs.com/cutemush/p/17855590.html

相关文章

  • 四、文件操作
    四、文件操作4.1新增文件(touch)1toucha.txt//在当前目录下创建名为a的txt文件(文件不存在),如果文件存在,将文件时间属性修改为当前系统时间4.2删除文件(rm)1rm文件名//删除当前目录下的文件2rm-f文件名//删除当前目录的的文件......
  • Sumsets(UVA10125)整数集合
    备课的时候发现了这道题,对于初识哈希来说并不算一道很简单的题。在查阅林厚从老师的示例代码与往届OI选手的博客后,大致理解了本题的思路。相关标签:Hash跳转至本题Description给定一个整数集合S,求一个最大的d,满足a+b+c=d,其中a,b,c,d∈SInput多组数据,每组数据包括:第一行一......
  • winform 使用了invoke还是报错 线程间操作无效: 从不是创建控件“Form2”的线程访问它
    winform开发中,遇到“线程间操作无效:从不是创建控件“Form2”的线程访问它”,明明使用了网上说的this.invoke,怎么还是会报这个错误呢?代码如下,由于是测试configureAwait功能时发现的,所以带了它的一些使用 privateasyncvoidbutton7_Click(objectsender,EventArgse)//点......
  • 视频操作---2.保存视频
    ......
  • 2-SET详解
    前置知识SET问题的标准定义:在计算机科学中,布尔可满足性问题(有时称为命题可满足性问题,缩写为SATISFIABILITY或SAT)是确定是否存在满足给定布尔公式的解释的问题。(全是废话)说人话就是,你要给n个变量,n需要给他赋值使它满足给你一些形如(x1为1或x3为0或x4为3)的条件,你必须满足所有条件......
  • 命令行 npm config set legacy-peer-deps true 的作用
    首先,我们需要了解npm,npm是NodePackageManager的缩写,它是Node.js的默认包管理工具。npm提供了许多命令,如install、uninstall、update等,用于管理Node.js的依赖和包。npmconfigsetlegacy-peer-depstrue是npm的一个命令,它主要用于解决npm7在处理peerdepende......
  • 自动生成接口文档操作手册
    API文档自动化生成版本说明实测仅适用于Spring2.x版本,Spring3需要额外配置后端创建一个SpringWeb项目项目初始化srcmainjavacom.exampleconfigKnife4jConfig.javaentityEntity.javacontrollerEntityController.javaApplication.javar......
  • 【Django基础】操作数据库详解
    djangoORM简介O(objects):类和对象。R(Relation):关系,关系数据库中的表格。M(Mapping):映射。DjangoORM框架的功能:建立模型类和表之间的对应关系,允许我们通过面向对象的方式来操作数据库。根据设计的模型类生成数据库中的表格。通过方便的配置就可以进行数据库的切换。......
  • 3-Hive学习路线-软件的基本操作
    2.3.软件的基本操作2.3.1.进入hive[root@localhost~]hive回车2.3.2.操作showdatabases;//显示所有数据库usedatabaseName;//切换到指定数据库showtables;//显示数据中所有表createtable.......
  • git bisect 查找引入bug的提交记录
    它的原理就是将代码提交的历史,按照两分法不断缩小定位。就是将代码历史一分为二,确定问题出在前半部分,还是后半部分,不断执行这个过程,直到范围缩小到某一次代码提交。step1:查找提交记录,找到可能引入错误的提交记录区间gitlog--pretty=onelinestep2:开始使用gitbisect......