[CQOI2009]中位数图

[CQOI2009]中位数图

https://ac.nowcoder.com/acm/problem/19913

因为只要个数所以可以大于b的记作1,小于b的记作-1,然后如果b的左右相加之和为0,则算成立
如:图片说明 写成图片说明 ,如果一个区间要成立的前提就是b左右两边的值相加为0,那么如果左边值相加为-2,右边值相加为2,并且b的左右两边的数的个数是大于2的,那么里面必定存在(-1,1)情况,所以就是可以确保求出得长度为奇数
然后分情况讨论
左区间位于b的位置
右区间位于b的位置
左右区间都不在b的位置
针对前两种情况可以直接进行从b位置进行左右求和,如果和为0,ans++
针对第三种情况,可以记录从b开始向左求和时到每一位的值,然后记录每一种值得数量
然后b向右求和,每到一位求出得值,ans+=b得左边出现其乘以-1的个数
最后ans++,因为对于b本身也算一种情况
时间复杂度:图片说明

#include<bits/stdc++.h>
using namespace std;
int n,b,a[100005],m[100005],ans=1,j;
int main()
{
    cin>>n>>b;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
        if(a[i]<b) a[i]=-1;
        if(a[i]>b) a[i]=1;
        if(a[i]==b) j=i;
    }
    int c=0;
    for(int i=j-1;i>=0;i--)
    {
        c+=a[i];
        m[c+n]++;
        if(!c) ans++;
    }
     c=0;
    for(int i=j+1;i<n;i++)
    {
        c+=a[i];
        ans+=m[n-c];
        if(c==0) ans++;
    }
    cout<<ans;
}
全部评论

相关推荐

头像
11-27 14:28
长沙理工大学
刷算法真的是提升代码能力最快的方法吗?&nbsp;刷算法真的是提升代码能力最快的方法吗?
牛牛不会牛泪:看你想提升什么,代码能力太宽泛了,是想提升算法能力还是工程能力? 工程能力做项目找实习,算法也分数据结构算法题和深度学习之类算法
点赞 评论 收藏
分享
一名愚蠢的人类:多少games小鬼留下了羡慕的泪水
投递荣耀等公司10个岗位
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务