前缀和 中位数图

[CQOI2009]中位数图

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

  1. 先对数据进行处理:大于b的改成1,小于的改成-1,等于的改成0
  2. 找到需要定的中位数b的位置
  3. 从这个位置从左往右扫一遍,统计当前值的出现次数
  4. 再从右往左扫一遍
  5. 最后的答案就是左边为零的数量+右边为零的数量+单独的b,再加上左边加右边能凑到零的数量,即互为相反数的LR数组中的积。
#include <bits/stdc++.h>
#define sc(x) scanf("%lld", &(x))
#define pr(x) printf("%lld\n", x)
using namespace std;
typedef long long ll;
const int N = 1e5 + 7;
ll a[N];
int L[N << 1], R[N << 1];
int main() {
    ll n, b, p;
    sc(n), sc(b);
    for (int i = 1; i <= n; ++i) {
        sc(a[i]);
        if (a[i] > b) a[i] = 1;
        else if (a[i] < b) a[i] = -1;
        else a[i] = 0, p = i;
    }
    for (int i = p - 1, res = 0; i >= 1; --i) {
        res += a[i];
        ++L[res + n];
    }
    for (int i = p + 1, res = 0; i <= n; ++i) {
        res += a[i];
        ++R[res + n];
    }
    ll ans = L[n] + R[n] + 1;
    for (int i = 0; i <= (n << 1); ++i) ans += L[n + n - i] * R[i];
    pr(ans);
    return 0;
}
算法竞赛之路 文章被收录于专栏

整理、记录算法竞赛的好题

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-10 14:00
林子大了什么鸟都有啊,我觉得我说的已经很客气了,阴阳谁呢
牛客62656195...:应该不是阴阳吧?你第一次注册的时候boss就说你是牛人
点赞 评论 收藏
分享
07-08 13:48
门头沟学院 C++
点赞 评论 收藏
分享
求offer的大角牛:不吃香菜
点赞 评论 收藏
分享
不要停下啊:大二打开牛客,你有机会开卷了,卷起来,去找课程学习,在牛客上看看大家面试笔试都需要会什么,岗位有什么需求就去学什么,努力的人就一定会有收获,这句话从来都经得起考验,像我现在大三了啥也不会,被迫强行考研,炼狱难度开局,啥也不会,找工作没希望了,考研有丝丝机会
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-07 12:04
毕业生招你惹你了,问一个发薪日来一句别看网上乱七八糟的你看哪个工作没有固定发薪日扭头就取消了面试就问了一句公司都是这个态度吗还搞上人身攻击了...
程序员小白条:呃呃呃,都还没面试,我都不会问这么细,何况通不通过,去不去都另说,你没实力和学历的话,在外面就这样,说实话没直接已读不回就不错了,浪费时间基本上
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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