ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

20210412set和multiset以及map拓展

2021-04-12 20:59:38  阅读:170  来源: 互联网

标签:map int 20210412set cin mp multiset include id


计蒜客 - T1229
现有一整数集(允许有重复元素),初始为空。我们定义如下操作:
add x

x
加入集合
del x
把集合中所有与
x
相等的元素删除
ask x
对集合中元素x的情况询问

对每种操作,我们要求进行如下输出。
add
输出操作后集合中
x
的个数
del
输出操作前集合中
x
的个数
ask
先输出
0

1
表示
x
是否曾被加入集合(
0
表示不曾加入),再输出当前集合中
x
的个数,中间用空格格开。

输入格式
第一行是一个整数
n
,表示命令数。
0

n

100000
。后面
n
行命令,如
Description
中所述。

输出格式

n
行,每行按要求输出。

Sample Input
7
add 1
add 1
ask 1
ask 2
del 2
del 1
ask 1
Sample Output
1
2
1 2
0 0
0
2
1 0

本题需要用到multiset,multiset是set库中一个非常有用的类型,它可以看成一个序列,插入一个数,删除一个数都能够在O(logn)的时间内完成,而且他能时刻保证序列中的数是有序的,而且序列中可以存在重复的数。
借鉴:https://blog.csdn.net/sodacoco/article/details/84798621
代码:

#include<bitsdc++.h>
#include<cstring>
#include<set>
using namespace std;
int main() {
	int n,x;
	char m[3];
	set<int>a;
	multiset<int>b;
	cin >> n;
	while(n--) {
		cin >> m;
		if(strcmp(m,"add")==0) {
			cin >> x;
			a.insert(x);
			b.insert(x);
			cout << b.count(x) << endl;
		}
		else if(strcmp(m,"del")==0) {
			cin >> x;
			cout << b.count(x) << endl;
			b.erase(x);
		}
		else {
			cin >> x;
			set<int>::iterator it;
			it=a.find(x);
			if(it==a.end()) {
				cout << "0 " << b.count(x) << endl;
			}
			else cout << "1 " << b.count(x) << endl;
		}
	}
}

计蒜客 - T1230
蒜头君新开了一家热血格斗场。格斗场实行会员制,但是新来的会员不需要交入会费,而只要同一名老会员打一场表演赛,证明自己的实力。

我们假设格斗的实力可以用一个正整数表示,成为实力值。另外,每个人都有一个唯一的
id
,也是一个正整数。为了使得比赛更好看,每一个新队员都会选择与他实力最为接近的人比赛,即比赛双方的实力值之差的绝对值越小越好,如果有两个人的实力值与他差别相同,则他会选择比他弱的那个(显然,虐人必被虐好)。

不幸的是,蒜头君一不小心把比赛记录弄丢了,但是他还保留着会员的注册记录。现在请你帮蒜头君恢复比赛纪录,按照时间顺序依次输出每场比赛双方的
id

输入格式
第一行一个数
n
(
0
<
n

100000
)
,表示格斗场新来的会员数(不包括蒜头君)。

以后
n
行每一行两个数,按照入会的时间给出会员的
id
(
2

id

10
6
)
和实力值(

10
9
)。一开始,蒜头君就算是会员,
id

1
,实力值
1000000000

输入保证两人的实力值不同。

输出格式
N
行,每行两个数,为每场比赛双方的
id
,新手的
id
写在前面。

Sample Input
3
2 1
3 3
4 2
Sample Output
2 1
3 2
4 2

一个模板题,主要从这个题上了解到map这库的更多作用,具体看代码。

#include<cstdio>
#include<iostream>
#include<map>
#define LL long long
using namespace std;

map<int,int> mp;//map函数会以第一个int自动排序(从小到大) 

int main()
{
	int n;
	while(cin >> n && n) {
		int id,g;
		mp.clear();
		mp[1000000000] = 1;
		while(n--) {
			cin >> id >> g;
			mp[g] = id;
			int ans = 0;
			map<int,int>::iterator it = mp.find(g);
			if(it == mp.begin()) ans = (++ it) -> second;//如果找到的g位置是第一个(也就是最小的值),则找比他的一的id
				else {
					map<int,int>::iterator it2 = it;
					it2 --;
					it ++;
					if(it -> first - g >= g - it2 -> first) {//值接近的id 
						ans = it2 -> second;
					}
					else ans = it -> second;
				}
			cout << id << " " << ans << endl;	  
		}
		
	}
	return 0;
}

链接:https://blog.csdn.net/sevenjoin/article/details/81943864?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161822471616780261987424%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=161822471616780261987424&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-81943864.first_rank_v2_pc_rank_v29&utm_term=c%2B%2Bmap

标签:map,int,20210412set,cin,mp,multiset,include,id
来源: https://blog.csdn.net/K1_KCY/article/details/115640120

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有