codeforces 1042D - Petya and Array【树状数组+离散化】
题目:戳这里
题意:有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【树状数组+离散化】的更多相关文章
- D. Petya and Array 树状数组
题意: 给出一个数组,元素有正有负有0,问其区间和小于 t 的子区间的个数. sum[ r ]-sum[ l-1 ]<t,其中sum是a的前缀和. 实现的方法就是从前往后对于每一个sum[ i ...
- hdu4605 树状数组+离散化+dfs
Magic Ball Game Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- BZOJ_5055_膜法师_树状数组+离散化
BZOJ_5055_膜法师_树状数组+离散化 Description 在经历过1e9次大型战争后的宇宙中现在还剩下n个完美维度, 现在来自多元宇宙的膜法师,想偷取其中的三个维度为伟大的长者续秒, 显然 ...
- POJ 2299 【树状数组 离散化】
题目链接:POJ 2299 Ultra-QuickSort Description In this problem, you have to analyze a particular sorting ...
- CodeForces 828E DNA Evolution(树状数组)题解
题意:给你一个串k,进行两个操作: “1 a b”:把a位置的字母换成b “2 l r s”:求l到r有多少个字母和s匹配,匹配的条件是这样:从l开始无限循环s形成一个串ss,然后匹配ss和指定区间的 ...
- Codeforces 909C Python Indentation:树状数组优化dp
题目链接:http://codeforces.com/contest/909/problem/C 题意: Python是没有大括号来标明语句块的,而是用严格的缩进来体现. 现在有一种简化版的Pytho ...
- Educational Codeforces Round 10 D. Nested Segments 离线树状数组 离散化
D. Nested Segments 题目连接: http://www.codeforces.com/contest/652/problem/D Description You are given n ...
- CodeForces - 597C Subsequences 【DP + 树状数组】
题目链接 http://codeforces.com/problemset/problem/597/C 题意 给出一个n 一个 k 求 n 个数中 长度为k的上升子序列 有多少个 思路 刚开始就是想用 ...
- Codeforces 635D Factory Repairs【树状数组】
又是看了很久的题目... 题目链接: http://codeforces.com/contest/635/problem/D 题意: 一家工厂生产维修之前每天生产b个,维修了k天之后每天生产a个,维修 ...
随机推荐
- [Usaco2008 Mar]牛跑步
题目描述 BESSIE准备用从牛棚跑到池塘的方法来锻炼. 但是因为她懒,她只准备沿着下坡的路跑到池塘, 然后走回牛棚. BESSIE也不想跑得太远,所以她想走最短的路经. 农场上一共有M (1 < ...
- MATLAB中load和imread的读取方式区别
load是导入文件,一般从mat文件中,读取的是结构体imread是图像处理工具箱的库函数,处理图像比较方便,读取的是矩阵 1.之前将数组或者矩阵保存为一个mat格式的文件,在进行load命令读取时: ...
- vue原生文件上传,可以多文件上传
1.单文件上传 <template> <div> <label for="fileInput"> <i aria-hidden=" ...
- (Sqlserver)sql求连续问题
题目一:create table etltable( name varchar(20) , seq int, money int); create table etltarget ( name var ...
- (001)每日SQL学习:关于UNION的使用
union内部必须有相同的列或者相同的数据类型,同时,每条 SELECT 语句中的列的顺序必须相同.union合并了select的结果集. union 与union all的不同: union合并了重 ...
- LOJ10104Blockade
POI 2008 Byteotia 城市有 n 个城镇,m 条双向道路.每条道路连接两个不同的城镇,没有重复的道路,所有城镇连通.输出 n 个数,代表如果把第i 个点去掉,将有多少对点不能互通. 输 ...
- Mysql数据库用户及用户权限管理,Navicat设置用户权限
Mysql数据库用户及用户权限管理,Navicat设置用户权限 一.Mysql数据库的权限 1.1 mysql数据库用户权限级别 1.2 mysql数据库用户权限 1.3 存放用户权限表的说明 二.用 ...
- Spring框架——AOP面向切面编程
简介 AOP练习 使用动态代理解决问题 Spring AOP 用AspectJ注解声明切面 前置后置通知 利用方法签名编写AspectJ切入点表达式 指定切面的优先级 基于XML的配置声明切面 Spr ...
- Django(中间件)
中间件的概念 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好会影响到 ...
- python3 自动部署MariaDB主从复制
master import configparser import os def config_mariadb_yum(): exists = os.path.exists('/etc/yum.rep ...