题目:戳这里

题意:有n个数,问有多少个区间满足[L,R]内的和小于t。

解题思路:

[L,R]内的和小于t等价于sum[R]-sum[L-1]<t,将sum[L-1]左移,可以看出R与L的关系sum[R]<sum[L-1]+t。

因为n个数有正有负,所以前缀和sum[]没法直接二分,需要构造出一个有序的前缀和。这样就可以想到用树状数组来维护前缀和,考虑到树状数组维护前缀和,将R和L的关系改为sum[R]-t<sum[L-1]更好写一些(个人习惯,固定r,二分出l)。然后就转化成了常规的离散化树状数组的题目:遍历R,二分查找l,加入答案,更新树状数组。

附ac代码:

 1 #include<bits/stdc++.h>
2 using namespace std;
3 typedef long long ll;
4 const int inf = 0x3f3f3f3f;
5 const int maxn = 2e5 + 10;
6 #define lowbit(x) x&-x
7 ll sum[maxn];
8 ll a[maxn];
9 ll c[maxn];
10 ll tem[maxn];
11 ll n, t;
12 void add(ll x, ll u) {
13 while(x <= n) {
14 c[x] += u;
15 x += lowbit(x);
16 }
17 }
18 ll getsum(ll x) {
19 ll res = 0;
20 while(x) {
21 res += c[x];
22 x -= lowbit(x);
23 }
24 return res;
25 }
26 int main() {
27 ll ans = 0;
28 scanf("%lld %lld", &n, &t);
29 for(ll i = 1; i <= n; ++i) {
30 scanf("%lld", &a[i]);
31 sum[i] = sum[i - 1] + a[i];
32 if(sum[i] < t) ++ans;
33 }
34 for(ll i = 1; i <= n; ++i) {
35 tem[i] = sum[i];
36 }
37 sort(tem + 1, tem + 1 + n);
38 for(ll i = 1; i <= n; ++i) {
39 ll x = lower_bound(tem + 1, tem + 1 + n, sum[i]) - tem;
40 ll y = upper_bound(tem + 1, tem + 1 + n, sum[i] - t) - tem;
41 ans += (i - 1 - getsum(y - 1));
42 add(x, 1ll);
43 }
44 printf("%lld\n", ans);
45 return 0;
46 }

codeforces 1042D - Petya and Array【树状数组+离散化】的更多相关文章

  1. D. Petya and Array 树状数组

    题意: 给出一个数组,元素有正有负有0,问其区间和小于 t 的子区间的个数. sum[ r ]-sum[ l-1 ]<t,其中sum是a的前缀和. 实现的方法就是从前往后对于每一个sum[ i ...

  2. hdu4605 树状数组+离散化+dfs

    Magic Ball Game Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  3. BZOJ_5055_膜法师_树状数组+离散化

    BZOJ_5055_膜法师_树状数组+离散化 Description 在经历过1e9次大型战争后的宇宙中现在还剩下n个完美维度, 现在来自多元宇宙的膜法师,想偷取其中的三个维度为伟大的长者续秒, 显然 ...

  4. POJ 2299 【树状数组 离散化】

    题目链接:POJ 2299 Ultra-QuickSort Description In this problem, you have to analyze a particular sorting ...

  5. CodeForces 828E DNA Evolution(树状数组)题解

    题意:给你一个串k,进行两个操作: “1 a b”:把a位置的字母换成b “2 l r s”:求l到r有多少个字母和s匹配,匹配的条件是这样:从l开始无限循环s形成一个串ss,然后匹配ss和指定区间的 ...

  6. Codeforces 909C Python Indentation:树状数组优化dp

    题目链接:http://codeforces.com/contest/909/problem/C 题意: Python是没有大括号来标明语句块的,而是用严格的缩进来体现. 现在有一种简化版的Pytho ...

  7. Educational Codeforces Round 10 D. Nested Segments 离线树状数组 离散化

    D. Nested Segments 题目连接: http://www.codeforces.com/contest/652/problem/D Description You are given n ...

  8. CodeForces - 597C Subsequences 【DP + 树状数组】

    题目链接 http://codeforces.com/problemset/problem/597/C 题意 给出一个n 一个 k 求 n 个数中 长度为k的上升子序列 有多少个 思路 刚开始就是想用 ...

  9. Codeforces 635D Factory Repairs【树状数组】

    又是看了很久的题目... 题目链接: http://codeforces.com/contest/635/problem/D 题意: 一家工厂生产维修之前每天生产b个,维修了k天之后每天生产a个,维修 ...

随机推荐

  1. 使用yaml来实现ingress-nginx

    创建一个ingress-nginx [root@k8s-master ingress]# cat ingress-nginx.yaml apiVersion: v1 kind: Namespace m ...

  2. JAVA中@Override的含义

    @Override是伪代码,表示重写(当然不写也可以),不过写上有如下好处: 1.可以当注释用,方便阅读: 2.编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错.例 ...

  3. JDK的各个版本

    Java的各个版本 从上图我们看出,Java的版本名最开始以JDK开头,后来以j2se开头,最后到现在以Java开头,所以这些名字我们都可以说,但人们说的更多的是JDK多少,或者Java多少

  4. secrets 管理工具 Vault 的介绍、安装及使用

    原文:https://ryan4yin.space/posts/expirence-of-vault/ Vault 是 hashicorp 推出的 secrets 管理.加密即服务与权限管理工具.它的 ...

  5. PWN_ret2text,ret2syscall,ret2shellcode

    首先了解下Linux中的保护机制(具体的绕过等后续再说) 1.canary(栈保护) 在函数开始时就随机产生一个值,将这个值CANARY放到栈上紧挨ebp的上一个位置,当攻击者想通过缓冲区溢出覆盖eb ...

  6. click的简单使用

    click的简单使用 先通过一个简单的例子来认知一下click把 import click @click.command() @click.option('-p', '--port', default ...

  7. 干货 | 携程多语言平台-Shark系统的高可用演进之路

    https://mp.weixin.qq.com/s/cycZslUlfyVNm2GVrZm1Cw 干货 | 携程多语言平台-Shark系统的高可用演进之路 原创 Fenlon 携程技术 2020-1 ...

  8. jvm 三种编译

    https://blog.csdn.net/fuxiaoxiaoyue/article/details/93497558 https://blog.csdn.net/tjiyu/article/det ...

  9. Centos 7 Redis 安装并开机启动

    一.下载并编译 cd /usr/local/bin目录可以自己选,我将redis安装到/usr/local/bin目录下.wget http://download.redis.io/releases/ ...

  10. pod资源限制和QoS探索

    简述 默认情况下,k8s不会对pod的资源使用进行限制,也就是说,pod可以无限使用主机的资源,例如CPU.内存等.为了保障k8s整体环境运行的稳定性,一般情况下,建议是对pod的资源使用进行限制,将 ...