当前位置: 首页 > article >正文

D. Unique Median【Codeforces Round 997 (Div. 2)】

D. Unique Median

在这里插入图片描述

思路:

长度为奇数的一定是好数组,很容易相当找长度为偶数中的好数组数量,但是过于复杂。正向解决困难的情况下可以尝试反向思考,即找长度为偶数的非好数组数量,总答案就等于 n*(n+1)/2 - 非好数组数量。
每次枚举一个 i i i 作为较大的那个中位数,那么这个数组不好的条件为 大于等于i的数的数量等于小于i的数的数量。如果将数组a中大于等于i的数记为1,小于i的数记为-1,得到一个新的数组b,那么不好的条件即为数组中 ∑ b [ i ] = 0 \sum b[i] = 0 b[i]=0
记b的前缀和为pre,那么区间 l − r l-r lr不好的条件为 p r e [ r ] = p r e [ l − 1 ] pre[r]=pre[l-1] pre[r]=pre[l1]
详见代码

代码:

#include <bits/stdc++.h>
#define endl '\n'
#define int long long
#define pb push_back
#define pii pair<int, int>
const int MOD = 1e9 + 7;
const int INF = 0x3f3f3f3f;
typedef long long ll;
using namespace std;

const int N = 500100;
int a[N], b[N], pre[N];

void solve(){
    int n;
    cin >> n;
    for (int i = 1; i <= n; ++i)
        cin >> a[i];
    int sum = n * (n + 1) / 2;
    for (int i = 1; i <= 10; ++i){ // 遍历i,枚举中位数中较大的那个
        map<int, int> mp; // 记录前缀和出现次数
        for (int j = 1; j <= n; ++j)
            if (a[j] >= i)
                b[j] = 1;
            else
                b[j] = -1;
        for (int j = 1; j <= n; ++j)
            pre[j] = pre[j - 1] + b[j];
        int pos = 0;// 单向指针,一直向右走到j-1 
        for (int j = 1; j <= n; ++j)
        {
            if (a[j] == i)  //如果a[j]等于当前枚举的i时,这样能确保不重复统计
                while (pos < j)  //pos移动到j-1来,并统计pre出现次数,存在mp中
                    ++mp[pre[pos++]];
            sum -= mp[pre[j]];  //pre[j]在1到j-1的出现次数即mp[pre[j]] 为前面这一段的非好子数组数,从总ans中减去
        }
    }
    cout << sum << '\n';
}

signed main(){
    cin.tie(0)->ios::sync_with_stdio(0);
    int T = 1;
    cin >> T;
    while (T--)
    {
        solve();
    }
    return 0;
}

http://www.kler.cn/a/521543.html

相关文章:

  • 基于GS(Gaussian Splatting)的机器人Sim2Real2Sim仿真平台
  • 七种RAG架构cheat sheet!
  • BGP边界网关协议(Border Gateway Protocol)Community属性
  • RLHF技术演进:从理论突破到工程实践
  • 探索与创新:DeepSeek R1与Ollama在深度研究中的应用
  • 【PySide6快速入门】QListWidget 列表控件
  • 【现代深度学习技术】深度学习计算 | 层和块
  • 什么是哈希表?如何在C语言中实现一个哈希表?
  • Codeforces Round 642 (Div. 3) E. K-periodic Garland(DP+前缀和)
  • C#面试常考随笔4:int? 和 int的区别,以及int?的运用场景?
  • 数据结构与算法学习笔记----求组合数
  • 【已解决】redisCache注解失效,没写cacheConfig
  • 项目测试之Postman
  • goframe 博客分类文章模型文档 主要解决关联
  • C++进阶课程第2期——排列与组合1
  • 数据分析常用的AI工具
  • Java基础知识总结(二十二)--List接口
  • 重回C语言之老兵重装上阵(十六)C语言可变参数
  • 低代码可视化-转盘小游戏可视化-代码生成器
  • OSPF协议考点