链接:https://ac.nowcoder.com/acm/contest/16806/A
来源:牛客网

题目描述
我们刚刚学了二分查找——所谓二分查找就是在一堆有序数里找某个符合要求的数。在学完二分查找之后如果让你玩猜数游戏(裁判选定一个目标数字,你说一个数裁判告诉你是高了还是低了直到你猜到那个数)的话,显然你会用二分的方式去猜。
但是不是每一个玩猜数游戏的人都知道二分是最好,甚至一个健忘的玩家都有可能在得到裁判回答的下一个瞬间就忘了他之前问了什么以及裁判的回答),而现在更可怕的是,这个告诉你猜的数是高还是低的裁判他也很健忘,他总是薛定谔的记得这个目标数字,也就是说他的回答有可能出错。我们已经不关心这个不靠谱的游戏本身了,我们更关心裁判这个薛定谔的记得到底有几个是记得......
现在给出这个健忘的玩家的所有猜测和裁判的所有回答,问裁判最多能有多少次是记得目标数字的,即裁判的回复是符合情况的。

思路:
其实就是找所有两点之间重叠最多的区域
按差分思想即可
同时注意一下数据比较大采用map离散化的手段

AC代码:

#include <iostream>
#include <map>
using namespace std;
map<int,int>a;
int inf=0x3f3f3f3f;
int main()
{
    int n;
    cin>>n;
    for(int i=0; i<n; i++)
    {
        int x;
        char op;
        cin>>x>>op;
        if(op=='.')a[x]++,a[x+1]--;
        if(op=='+')a[x]--,a[-inf]++;
        if(op=='-')a[x+1]++;
    }
    int temp=0,ans=0;
    for(auto it:a)//遍历map
    {
        temp+=it.second;//加上每个map对应的值
        ans=max(temp,ans);
    }
    cout<<ans<<endl;
    return 0;
}