牛客——二分(差分数组前缀和)

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

我们刚刚学了二分查找——所谓二分查找就是在一堆有序数里找某个符合要求的数。在学完二分查找之后如果让你玩猜数游戏(裁判选定一个目标数字,你说一个数裁判告诉你是高了还是低了直到你猜到那个数)的话,显然你会用二分的方式去猜。

但是不是每一个玩猜数游戏的人都知道二分是最好,甚至一个健忘的玩家都有可能在得到裁判回答的下一个瞬间就忘了他之前问了什么以及裁判的回答),而现在更可怕的是,这个告诉你猜的数是高还是低的裁判他也很健忘,他总是薛定谔的记得这个目标数字,也就是说他的回答有可能出错。我们已经不关心这个不靠谱的游戏本身了,我们更关心裁判这个薛定谔的记得到底有几个是记得......

现在给出这个健忘的玩家的所有猜测和裁判的所有回答,问裁判最多能有多少次是记得目标数字的,即裁判的回复是符合情况的。

输入描述:

 
  

第一行包含一个正整数n,表示裁判的回答数(也是玩家的猜数次数)。

接下来n行,首先是猜的数,然后是一个空格,然后是一个符号。符号如果是“+”说明猜的数比答案大,“-”说明比答案小,“.”说明猜到了答案。

输出描述:

包含一个正整数,为裁判最多有多少个回答是正确的。

牛客——二分(差分数组前缀和)_第1张图片

#include
using namespace std;
const int inf=INT_MAX;
int main()
{
	int n,x;
	char c;
	mapmp;
	cin>>n;
	while(n--)
	{
		cin>>x>>c;
		if(c=='.') mp[x]++,mp[x+1]--;
		if(c=='+') mp[-inf]++,mp[x]--;
		if(c=='-') mp[x+1]++,mp[inf]--;
	}
	int h=-inf,num=0;
	for(auto s:mp)
	{
		num+=s.second;
		h=max(num,h);
	}
	cout<

注意:这里不能用数组存储,因为数组的下标是从0开始,而这里要从负无穷大开始 ,用关联容器map。

详解可见:牛客 二分_csdn牛客二分-CSDN博客

另外,补充一下:

1.map mp 是一个 C++ 中的容器,它是一种关联容器,用于存储键值对(key-value pairs),其中的键和值都是整数类型。它基于红黑树(Red-Black Tree)实现,可以实现快速的插入、删除和查找操作。

在这个容器中,每个键只能出现一次,如果要插入一个已经存在的键,则会覆盖原有的值。mp 是一个变量名,你可以根据实际情况自行命名。

你可以使用 map 容器来解决一些需要按照键进行排序并且快速查找的问题。例如,可以使用 map 容器来统计元素的频次,或者按照键的顺序遍历元素等。

下面是一些常见的 map 容器的操作示例:

  • 插入键值对:mp[key] = value;
  • 查找键对应的值:mp[key]
  • 删除键值对:mp.erase(key);
  • 遍历容器中的键值对:使用迭代器进行遍历

2.差分数组的前缀和是指对差分数组进行前缀和运算后得到的新数组。差分数组是指对原始数组的相邻元素进行差分运算得到的数组。

假设原始数组为 a,差分数组为 d,前缀和数组为 s,则有以下关系:

  • d[i] = a[i] - a[i-1],其中 1 <= i < n(注意:对于差分数组 d,下标从 1 开始,与原始数组的下标对应)。
  • s[0] = 0,即前缀和数组的第一个元素为 0。
  • s[i] = d[1] + d[2] + ... + d[i] = a[i],其中 1 <= i <= n

通过对差分数组进行前缀和运算,可以得到原始数组。而原始数组经过差分运算得到的差分数组,则可以通过对差分数组进行前缀和运算还原出原始数组。

差分数组的前缀和可以用于高效地进行区间更新操作。通过对差分数组进行前缀和运算,可以得到原始数组,然后在原始数组中进行区间更新操作,再生成新的差分数组。

你可能感兴趣的:(算法,差分数组前缀和)