博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ARC075 E.Meaningful Mean(树状数组)
阅读量:6698 次
发布时间:2019-06-25

本文共 1036 字,大约阅读时间需要 3 分钟。

题目大意:给定n和k,问an中有多少子区间的平均值大于等于k

 

很巧妙的一个式子,就是如果一个区间[l, r]满足条件

那么则有

sum[r] - sum[l-1] >= (r-l+1)*k

整理一下就是sum[r] - r*k >= sum[l-1] - (l-1)*k

然后先离散一下,用树状数组就可以了

 

#include 
#include
#include
#include
#include
using namespace std;typedef long long LL;const int maxn = 2e5 + 100;int n, k;LL a[maxn], c[maxn*4];map
M;vector
V;void Modify(int x, int s){ for(; x <= n; x += x&(-x)) c[x] += s;}LL Query(int y){ if(y <= 0) return 0; LL ans = 0; for(int x = y; x; x -= x&(-x)) ans += c[x]; return ans;}int main(){ int x; scanf("%d %d", &n, &k); for(int i = 1; i <= n; i++) scanf("%d", &x), a[i] = x; LL sum = 0; for(int i = 1; i <= n; i++) { sum += a[i]; sum -= k; V.push_back(sum); } sort(V.begin(), V.end()); for(int i = 0; i < V.size(); i++) M[V[i]] = i+1; sum = 0; LL ans = 0; for(int i = 1; i <= n; i++){ sum += a[i]; sum -= k; ans += Query(M[sum]); if(sum >= 0) ans++; Modify(M[sum], 1); } cout<
<

 

转载于:https://www.cnblogs.com/Saurus/p/7056721.html

你可能感兴趣的文章
特斯拉股价暴跌,疯狂烧钱是否真的能够带来高额回报?
查看>>
面试进阶题集锦-持续更新
查看>>
vaOJ10369 - Arctic Network
查看>>
Class文件结构
查看>>
YY一下,扎克伯格做了一个什么样的AI家居助手?
查看>>
SpringJDBC解析3-回调函数(update为例)
查看>>
Redis进阶实践之十六 Redis大批量增加数据
查看>>
SublimeText2 快捷键
查看>>
云栖科技评论第48期:前沿科技对世界的改造 我们这代人只完成了1%
查看>>
Redis3.2.5部署(单节点)
查看>>
AI研究的盲点:无解的神经网络内在逻辑
查看>>
Java操作MongoDB
查看>>
JDBC与JNDI应用比较
查看>>
分布式系统开发工具包 —— 基于Kryo的Java对象序列化
查看>>
Python功能之反射
查看>>
从Android源码的角度分析Binder机制
查看>>
更改阿里云域名解析台里某个域名绑定的IP之后不能解析到新IP
查看>>
Powershell检测AD账户密码过期时间并邮件通知
查看>>
CentOS7安装OpenFire
查看>>
ActiveMQ(07):ActiveMQ结合Spring开发--建议
查看>>