BJOI2016 回转寿司
Description
给定一个长度为 \(N\) 的序列 \(a\),和一个区间 \([L, R]\)。
求多少连续子序列的权值和在区间内,即满足 \(1 \le i \le j \le n\) 且满足 \(L \le \sum_{k=i}^{j} a[i] \le R\) 的方案数。
Solution
区间和,很容易想到用前缀和转换,这样区间相关变成了两个点。设 \(s\) 为 \(a\) 的前缀和,那么统计就变成了这样。
统计 \(0 \le i < j \le n\) 中满足 \(L \le s[j] - s[i] \le R\) 的方案数的。数据只有一组询问,显然是支持我们枚举一维,的不妨枚举 \(s[i]\),那么转化一下式子,就是满足 \(L + s[i] \le s[j] \le R + s[i]\) 且 \(i < j\) 的 \(j\) 的数量。
这就是一个显然的二维偏序问题,做法就是:
- 倒序枚举 \(i\)
- 查询答案
- 插入 \(s[i]\)
单调修改、区间查询这个操作我们再熟悉不过了。但是这次因为离散化会把值域信息搞没,所以不能离散化,只能动态开点线段树。(后来想了一下好像也可以,把数值全部打进数组离散化一下,所以写了两个版本)。
时间复杂度
\(O(n\log_2 10^{10})\)
Code
动态开点线段树版
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long LL;
const int N = 100005;
int n, L, R, rt, idx;
struct T{
int l, r, v;
} t[N * 30];
LL Lt = 9e18, Rt = -9e18;
LL s[N], ans = 0;
void inline pushup(int p) {
t[p].v = t[t[p].l].v + t[t[p].r].v;
}
void insert(int &p, LL l, LL r, LL x) {
if (!p) p = ++idx;
t[p].v++;
if (l == r) return;
LL mid = (l + r) >> 1;
if (x <= mid) insert(t[p].l, l, mid, x);
else insert(t[p].r, mid + 1, r, x);
}
int query(int p, LL l, LL r, LL x, LL y) {
if (!p) return 0;
if (x <= l && r <= y) return t[p].v;
LL mid = (l + r) >> 1, res = 0;
if (x <= mid) res += query(t[p].l, l, mid, x, y);
if (mid < y) res += query(t[p].r, mid + 1, r, x, y);
return res;
}
int main() {
scanf("%d%d%d", &n, &L, &R);
for (int i = 1; i <= n; i++) scanf("%lld", &s[i]), s[i] += s[i - 1];
for (int i = 1; i <= n; i++) {
Lt = min(Lt, s[i]);
Rt = max(Rt, R + s[i]);
}
for (int i = n; ~i; i--) {
ans += query(rt, Lt, Rt, L + s[i], R + s[i]);
if (i) insert(rt, Lt, Rt, s[i]);
}
printf("%lld\n", ans);
return 0;
}
树状数组版
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 100005;
int n, L, R, tot, c[N];
LL s[N], d[N], ans = 0;
int inline get(LL x) {
return lower_bound(d + 1, d + 1 + tot, x) - d;
}
void inline add(int x) {
for (; x <= tot; x += x & -x) c[x]++;
}
int inline ask(int x) {
int res = 0;
for (; x; x -= x & -x) res += c[x];
return res;
}
int main() {
scanf("%d%d%d", &n, &L, &R);
for (int i = 1; i <= n; i++)
scanf("%lld", &s[i]), s[i] += s[i - 1], d[++tot] = s[i];
sort(d + 1, d + 1 + tot);
tot = unique(d + 1, d + 1 + tot) - d - 1;
for (int i = n; ~i; i--) {
int A = lower_bound(d + 1, d + 1 + tot, L + s[i]) - d - 1;
int B = upper_bound(d + 1, d + 1 + tot, R + s[i]) - d - 1;
ans += ask(B) - ask(A);
if (i) add(get(s[i]));
}
printf("%lld\n", ans);
return 0;
}
BJOI2016 回转寿司的更多相关文章
- P5459 [BJOI2016]回转寿司
传送门 暴力怎么搞,维护前缀和 $s[i]$ ,对于每一个 $s[i]$,枚举所有 $j\in[0,i-1]$,看看 $s[i]-s[j]$ 是否属于 $[L,R]$ 如果属于就加入答案 $s[i]- ...
- BZOJ_4627_[BeiJing2016]回转寿司_离散化+树状数组
BZOJ_4627_[BeiJing2016]回转寿司_离散化+树状数组 Description 酷爱日料的小Z经常光顾学校东门外的回转寿司店.在这里,一盘盘寿司通过传送带依次呈现在小Z眼前.不同的寿 ...
- bzoj 4627: [BeiJing2016]回转寿司 -- 权值线段树
4627: [BeiJing2016]回转寿司 Time Limit: 10 Sec Memory Limit: 256 MB Description 酷爱日料的小Z经常光顾学校东门外的回转寿司店. ...
- bzoj 4627: [BeiJing2016]回转寿司
4627: [BeiJing2016]回转寿司 Description 酷爱日料的小Z经常光顾学校东门外的回转寿司店.在这里,一盘盘寿司通过传送带依次呈现在小Z眼前.不同的寿 司带给小Z的味觉感受是不 ...
- 【BZOJ4627】[BeiJing2016]回转寿司 SBT
[BZOJ4627][BeiJing2016]回转寿司 Description 酷爱日料的小Z经常光顾学校东门外的回转寿司店.在这里,一盘盘寿司通过传送带依次呈现在小Z眼前.不同的寿司带给小Z的味觉感 ...
- [LOJ2736] [JOISC 2016 Day 3] 回转寿司 (分块+堆)
[LOJ2736] [JOISC 2016 Day 3] 回转寿司 (分块+堆) 题面 给出一个有n 个点的环,环上各点有一个初始权值 \(a_i\) 给出 Q 个询问,每次询问给出一个区间 [l,r ...
- K - 回转寿司(值域段数(板题) + 动态开点)
回转寿司 Description 酷爱日料的小Z经常光顾学校东门外的回转寿司店.在这里,一盘盘寿司通过传送带依次呈现在小Z眼前.不同的寿 司带给小Z的味觉感受是不一样的,我们定义小Z对每盘寿司都有一个 ...
- 【bzoj4627】[BeiJing2016]回转寿司 离散化+树状数组
题目描述 给出一个长度为n的序列,求所有元素的和在[L,R]范围内的连续子序列的个数. 输入 第一行包含三个整数N,L和R,分别表示寿司盘数,满意度的下限和上限. 第二行包含N个整数Ai,表示小Z对寿 ...
- bzoj4627: [BeiJing2016]回转寿司
权值线段树. 要求 L<=(s[i]-s[j])<=R (i<j). 的i和j的数量. 所以把前缀和s加入一棵权值线段树,每次询问满足条件的范围中的权值的个数. 权值线段树不能像普 ...
随机推荐
- python 第二天 之循环与判断
人生苦短我用python------这句话说的一点都没有错,python功能真的是太强大了,最主要的节约时间,节约时间对于一个程序员意味着什么?意味着早睡,意味着更多的时间可以干更多的活.少熬了了多少 ...
- maven 笔记2
maven 中央工厂的位置:D:\dubbo\apache-maven-3.2.5\lib D:\dubbo\apache-maven-3.2.5\lib pom-4.0.0.xml reposito ...
- 阿里巴巴已offer:Java实习五面详细面经(附解答)
1.岗位 Java后台开发实习生 2.时间表 2020/3/18 提交简历 & 测评 2020/3/23 笔试 2020/3/26 简历面 2020/4/11 技术一面 2020/4/14 技 ...
- DP中环形处理 +(POJ 1179 题解)
DP中环形处理 对于DP中存在环的情况,大致有两种处理的方法: 对于很多的区间DP来说,很常见的方法就是把原来的环从任意两点断开(注意并不是直接删掉这条边),在复制一条一模一样的链在这条链的后方,当做 ...
- 【建议收藏】阿里P7总结的Spring注解笔记,把组件注册讲的明明白白
环境搭建 注解的方式是通过配置类的方式来注入组件,注解注入要比XML注入的方式简单,注解注入也需要在前者的基础上,添加一个spring-context的包,也是实际开发中常用的方式. 准备所需Jar包 ...
- 如何用Camtasia将喜欢的视频做出复古的感觉
不知道各位可有看老电影的习惯,我个人觉得一些老电影那种别具一格的画面感是非常吸引人的韵味,尽管其色彩不是很鲜艳,但是这种黑白的感觉,对于现在的我们,往往有着不一样的吸引力.于是,我就尝试着用Camta ...
- ABBYY FineReader 15 中保存和导出PDF文档的小细节
运用ABBYY FineReader OCR文字识别软件,用户能将各种格式的PDF文档保存为新的PDF文档.PDF/A格式文档,以及Microsoft Word.Excel.PPT等格式.在保存与导出 ...
- kakafka - 为CQRS而生fka - 为CQRS而生
前段时间跟一个朋友聊起kafka,flint,spark这些是不是某种分布式运算框架.我自认为的分布式运算框架最基础条件是能够把多个集群节点当作一个完整的系统,然后程序好像是在同一台机器的内存里运行一 ...
- SFTP 服务器cd() 方法和 ls() 方法说明
方法说明: cd():这个方法用于进入某个目录下. 默认情况,当连接SFTP服务器成功后直接进入用户目录,比如我连接自己本机SFTP服务器后进入/Users/mac目录.cd() 方法进入每一个目录都 ...
- Gradle全局代理配置
配置文件路径:C:\Users\myName\.gradle\gradle.properties 代理配置内容: systemProp.http.proxyHost=127.0.0.1 systemP ...