小红统计区间(hard) - 树状数组 + 离散化

题面

分析

存在负数不满足单调性,因此无法二分或者双指针,对于每一段符合条件的区间 [ l , r ] [l, r] [l,r] 都有 s u m [ r ] − s u m [ l − 1 ] > = k sum[r] - sum[l - 1] >= k sum[r]−sum[l−1]>=k ,也就是 s u m [ l − 1 ] < = s u m [ r ] − k sum[l - 1] <= sum[r] - k sum[l−1]<=sum[r]−k ,那么如果对于所有区间的前缀和来进行顺序存储,那么对于当前前缀和 s u m [ i ] sum[i] sum[i] ,可以去找小于等于 s u m [ i ] − k sum[i] - k sum[i]−k 的符合条件的前缀和有多少,但是前缀和的范围很大,所以就要进行离散化,将所有需要用到的前缀和都进行i离散化重新定下标,然后可以通过树状数组每次对遍历到的前缀和的位置加一,统计可以加上树状数组查询 s u m [ i ] − k sum[i] - k sum[i]−k 的结果,也就是这之前有多少个满足条件的前缀和。

代码
cpp 复制代码
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const int N = 2e5 + 10;

ll a[N];
int tr[N];
map<ll, int> m;

void add(int u) {
    for(int i = u; i < N; i += (i & -i)) {
        tr[i] ++;
    }
    return ;
}

int query(int x) {
    int ans = 0;
    for(int i = x; i >= 1; i -= i & -i) ans += tr[i];
    return ans;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int n;
    ll k;
    cin >> n >> k;
    for(int i = 1; i <= n; i ++) {
        cin >> a[i];
        a[i] += a[i - 1];
    }
    m[0] = 1;
    for(int i = 1; i <= n; i ++) {
        m[a[i]] = 1;
        m[a[i] - k] = 1;
    }
    int now = 1;
    for(auto &x: m) {
        x.second = now ++;
    }
    //for(auto j: m) cout <<j.first << ' ' <<  j.second << endl;
    ll ans = 0;
    add(m[0]);
    for(int i = 1; i <= n; i ++) {
        ans += query(m[a[i] - k]);
        add(m[a[i]]);
    }
    cout << ans << "\n";
}
相关推荐
SweetCode4 分钟前
裴蜀定理:整数解的奥秘
数据结构·python·线性代数·算法·机器学习
ゞ 正在缓冲99%…18 分钟前
leetcode76.最小覆盖子串
java·算法·leetcode·字符串·双指针·滑动窗口
xuanjiong18 分钟前
纯个人整理,蓝桥杯使用的算法模板day2(0-1背包问题),手打个人理解注释,超全面,且均已验证成功(附带详细手写“模拟流程图”,全网首个
算法·蓝桥杯·动态规划
Zhichao_9736 分钟前
【UE5 C++课程系列笔记】33——商业化Json读写
c++·ue5
惊鸿.Jh38 分钟前
【滑动窗口】3254. 长度为 K 的子数组的能量值 I
数据结构·算法·leetcode
明灯L38 分钟前
《函数基础与内存机制深度剖析:从 return 语句到各类经典编程题详解》
经验分享·python·算法·链表·经典例题
碳基学AI44 分钟前
哈尔滨工业大学DeepSeek公开课:探索大模型原理、技术与应用从GPT到DeepSeek|附视频与讲义免费下载方法
大数据·人工智能·python·gpt·算法·语言模型·集成学习
补三补四1 小时前
机器学习-聚类分析算法
人工智能·深度学习·算法·机器学习
独好紫罗兰1 小时前
洛谷题单3-P5718 【深基4.例2】找最小值-python-流程图重构
开发语言·python·算法
云边有个稻草人1 小时前
【C++】第八节—string类(上)——详解+代码示例
开发语言·c++·迭代器·string类·语法糖auto和范围for·string类的常用接口·operator[]