【每日一题】35. [CQOI2009]中位数图 (前缀和,贡献值计算)

补题链接:Here

算法涉及:前缀和,贡献值计算

经典中位数计数问题,记得以前百度之星也出过类似的题,这道题有一个限定范围是要奇数区间的
我们很容易想到,奇数下标到偶数下标或者偶数下标到奇数下标的长度一定是奇数的
对于每个数字,只可能大于,等于,小于b,于是可以重新分别赋值为1,0,-1
那么维护两个前缀和和一个now,如果当前在奇数下标,查询偶数的前缀和的cnt2[now],否则查询奇数的前缀和cnt1[now]
now 是 1到i 的前缀和,因为如果有两个位置比如 2 和 5 的前缀和相等,那么必有 3到4 这段区间的和为 0
所以可以通过查表来计算贡献。另外要注意奇数区间下,一定要有一个b,所以还要找下b的位置

using ll = long long;
const int N = 1e5 + 10;

int a[N];
int cnt1[N * 3], cnt2[N * 3];

void solve() {
    int n, m; cin >> n >> m;
    int p = -1;
    cnt2[N] = 1;
    for (int i = 1; i <= n; ++i) {
        cin >> a[i];
        if (a[i] > m)a[i] = 1;
        else if (a[i] == m)a[i] = 0, p = i;
        else a[i] = -1;
    }
    int now = 0;
    ll ans = 0;
    for (int i = 1; i <= n; ++i) {
        now += a[i];
        if (i & 1)
            if (i >= p) ans += cnt2[N + now];
            else cnt1[N + now]++;
        else {
            if (i >= p)ans += cnt1[N + now];
            else cnt2[N + now]++;
        }
    }
    cout << ans;
}
posted @   RioTian  阅读(78)  评论(0编辑  收藏  举报
编辑推荐:
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 全程不用写代码,我用AI程序员写了一个飞机大战
点击右上角即可分享
微信分享提示