二分

传送门

和二分没有半毛钱关系,题目大意有点不好描述。

题解:数的范围在int范围,而且有负数,不能用数组,用map存储,前缀和代表有多少个最多有多少种满足描述,取最大的前缀和。

找重叠区间最多的个数。输出.时,a点加一。输出-时,负无穷到a-1加一。输出+时,a+1到正无穷加一。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5;
const int inf=INT_MAX;
map<int,int>m;
int main(){
    int n,a;char c;cin>>n;
    for(int i=0;i<n;i++){
        scanf("%d %c",&a,&c);
        if(c=='.'){
            m[a]++;m[a+1]--;///a点加一
        }
        else if(c=='+'){
            m[-inf]++;m[a]--;///负无穷到a-1加一
        }
        else {
            m[a+1]++;///a+1到正无穷加一
        }
    }
    map<int,int>::iterator it;
    int ans=-inf;int t=0;
    for(it=m.begin();it!=m.end();it++){
        t+=it->second;
        ans=max(t,ans);
    }
    cout<<ans<<endl;
    return 0;
}

 

posted @ 2020-05-28 21:43  mohari  阅读(174)  评论(0编辑  收藏  举报