二分

二分

https://ac.nowcoder.com/acm/contest/5773/D

唉,被题目坑了。还以为题目好心提醒是二分。比赛时一直找二分条件,mmm一直找不出。(我真是个憨憨)
最后几分钟,突然搞明白,不用二分。:-(;看题目,首先暴力枚举,怎么暴力??对于每个int型范围内的整数,都有可能。那么枚举每个数,判断最多符合条件的。这是最初的思路,当然暴力过不了;
想怎么优化,我们想知道对于每个数,其符合条件的个数k;
例如:
5 . 则整数5 +1
6 + 则整数大于6的所有数 +1
5 . 5 +1
8 - 小于8的所有数+1
序列上操作,那么差分可以满足;(入门课里讲了)

#include<bits/stdc++.h>
using namespace std;
const int inf=INT_MAX;//int型数据最大值,因为是对每个数进行统计
int n,a[1000000],max1=0,sum[10000000];
map<int,int> M;//数据过大,数组存不下,并且数据还可为负
char s[1000000];
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) 
    {
        cin>>a[i]>>s[i];
    }
    for(int i=1;i<=n;i++)
    {
        if(s[i]=='.') {M[a[i]]++,M[a[i]+1]--;}
        if(s[i]=='+'){M[a[i]]--,M[-inf]++;}
        if(s[i]=='-'){M[inf]--,M[a[i]+1]++;}
    }
    int ans=-inf,h=0;
    for(auto x:M)
    {
        h+=x.second;
        ans=max(h,ans);
    }
    cout<<ans;
}
全部评论
为啥+的时候不是M(-inf)++;M(a[i]+1)--;-的时候不是M(a[i])++,M(inf)--
点赞 回复 分享
发布于 2023-06-08 20:51 江苏
+的意思是猜的数比答案大,那么答案就比猜的数小,+代表小于a[i]的数加一,例子讲错了吧,不过代码是正常的
点赞 回复 分享
发布于 2023-03-15 21:05 湖北
还有那差分的区间怪怪的,相等M[a[i]+1]++为啥又要加1呢
点赞 回复 分享
发布于 2020-05-27 19:30
for(auto x:M) { h+=x.second; ans=max(h,ans); }大佬这里是什么意思呢
点赞 回复 分享
发布于 2020-05-27 19:27
楼主,请问离散化可以实现吗,尝试一下嘿嘿
点赞 回复 分享
发布于 2020-05-26 13:49

相关推荐

点赞 评论 收藏
分享
阿武同学:基本信息保留前面三行,其他的可以全部删掉,邮箱最重要的你没写,主修课程精简到8个以内,实习里面2/3/4都是水内容的,非要写的话建议两到三句话,项目经历排版优化下,自我评价缩到三行
点赞 评论 收藏
分享
评论
14
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务