#C2022D. 奶牛大亨

奶牛大亨

题目背景

题目背景可以安全跳过。 You're safe to skip this part.

作为一名OIer(或USACOer或ICPCer),自学是非常重要的品质。毕竟老师能讲的东西是有限的,而知识是无限的。

现在简要介绍这些STL该如何学习,以multiset为例:

image

首先先看它的定义: std::multiset is an associative container that contains a sorted set of objects of type Key. Unlike set, multiple keys with equivalent values are allowed.

然后直接看成员函数:

image

选择你需要用的函数,比如我猜你需要用erase

erase

image

你可能想问,一个函数为何有这么多种声明?到底哪个是对的?答案是:都是对的。这涉及到C++中"多态"的概念:

multiset<int> m;
m.erase(m.begin()) //就会调用 1)
m.erase(m.begin(),m.end()) //就会调用 2)
m.erase(1) //就会调用 3)

没错,编译器根据你调用函数时传入的参数的种类、个数来调用正确的那个函数。所以相同名字的函数有很多种用法,这就是"多态"。

注意到3)条,m.erase(x),会一次性删除所有的x。所以,如果你只需要删除一个x,你或许应该写m.erase(m.find(x))

注意到第三段的内容,erase必须接受一个能解引用的迭代器,即你需要判断m.find(x)!=m.end()来确保不会Runtime Error

同样,你可以找一找如何使用m.lower_bound

最后要提醒一点的是,cppreference(也就是上述网站)为大家贴心地准备了例子(一般在页面的底部),一般来说编程的问题,看看例子都能解决一大部分问题。

image

std::set

std::map

std::multiset

以上内容可以学一学。And feel free to use them !

题目描述

也许会有那么一个宇宙,在那个宇宙中,我不用永远地活在我的农场之里。

Farmer John终于当上奶牛经销商了! 他有源源不断的奶牛和顾客。具体来说,在他经营的这段时间内,依次nn次事件发生。每次事件要么是来了一位顾客,要么是来了一头奶牛。每支奶牛有自己的品质qiq_i,每位顾客也有自己的要求rir_i。奶牛来后,会直接进入Farmer John的仓库; 顾客来后,会要求购买一头品质ri\ge r_i的奶牛,而Farmer John要么卖给他一头符合要求的奶牛,要么不卖。现在Farmer John想知道,他最多可以卖出多少头奶牛?

输入格式

输入第一行仅包含一个整数nn,表示事件的个数。

接下来nn行,每行包含两个整数op,valop,valop=0op=0说明来了一头品质为valval的奶牛,op=1op=1说明来了一名要求为valval的顾客。

大千世界无奇不有,有些奶牛非常讨厌所以品质为负数,有些顾客就喜欢有个性的奶牛,所以要求也可以为负数。

输出格式

输出仅包含一个整数,表示Farmer John最多卖多少头牛。

样例

5
0 15
0 20
1 10
1 16
1 21
2
10
1 28
1 1
1 -77
0 7
0 93
1 -62
0 75
1 16
0 -28
0 8
2

数据范围

对于40%40\%的数据,n<1000n<1000

对于100%100\%的数据,n106,qi109,ri109n \le 10^6,|q_i| \le 10^9,|r_i| \le 10^9