题目链接

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 回转寿司的更多相关文章

  1. P5459 [BJOI2016]回转寿司

    传送门 暴力怎么搞,维护前缀和 $s[i]$ ,对于每一个 $s[i]$,枚举所有 $j\in[0,i-1]$,看看 $s[i]-s[j]$ 是否属于 $[L,R]$ 如果属于就加入答案 $s[i]- ...

  2. BZOJ_4627_[BeiJing2016]回转寿司_离散化+树状数组

    BZOJ_4627_[BeiJing2016]回转寿司_离散化+树状数组 Description 酷爱日料的小Z经常光顾学校东门外的回转寿司店.在这里,一盘盘寿司通过传送带依次呈现在小Z眼前.不同的寿 ...

  3. bzoj 4627: [BeiJing2016]回转寿司 -- 权值线段树

    4627: [BeiJing2016]回转寿司 Time Limit: 10 Sec  Memory Limit: 256 MB Description 酷爱日料的小Z经常光顾学校东门外的回转寿司店. ...

  4. bzoj 4627: [BeiJing2016]回转寿司

    4627: [BeiJing2016]回转寿司 Description 酷爱日料的小Z经常光顾学校东门外的回转寿司店.在这里,一盘盘寿司通过传送带依次呈现在小Z眼前.不同的寿 司带给小Z的味觉感受是不 ...

  5. 【BZOJ4627】[BeiJing2016]回转寿司 SBT

    [BZOJ4627][BeiJing2016]回转寿司 Description 酷爱日料的小Z经常光顾学校东门外的回转寿司店.在这里,一盘盘寿司通过传送带依次呈现在小Z眼前.不同的寿司带给小Z的味觉感 ...

  6. [LOJ2736] [JOISC 2016 Day 3] 回转寿司 (分块+堆)

    [LOJ2736] [JOISC 2016 Day 3] 回转寿司 (分块+堆) 题面 给出一个有n 个点的环,环上各点有一个初始权值 \(a_i\) 给出 Q 个询问,每次询问给出一个区间 [l,r ...

  7. K - 回转寿司(值域段数(板题) + 动态开点)

    回转寿司 Description 酷爱日料的小Z经常光顾学校东门外的回转寿司店.在这里,一盘盘寿司通过传送带依次呈现在小Z眼前.不同的寿 司带给小Z的味觉感受是不一样的,我们定义小Z对每盘寿司都有一个 ...

  8. 【bzoj4627】[BeiJing2016]回转寿司 离散化+树状数组

    题目描述 给出一个长度为n的序列,求所有元素的和在[L,R]范围内的连续子序列的个数. 输入 第一行包含三个整数N,L和R,分别表示寿司盘数,满意度的下限和上限. 第二行包含N个整数Ai,表示小Z对寿 ...

  9. bzoj4627: [BeiJing2016]回转寿司

    权值线段树. 要求 L<=(s[i]-s[j])<=R  (i<j). 的i和j的数量. 所以把前缀和s加入一棵权值线段树,每次询问满足条件的范围中的权值的个数. 权值线段树不能像普 ...

随机推荐

  1. CCF-201512-消除类游戏

    问题描述 试题编号: 201512-2 试题名称: 消除类游戏 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游 ...

  2. Python_俄罗斯方块

    网上资料,仅供学习,希望以后自己也能看懂再改进下... """ 俄罗斯方块 author: wolfstar last edited: 2018年1月 "&qu ...

  3. Unity Lod

    LOD是Level Of Detais 的简称,多细节层次,根据摄像机与物体距离,unity会自动切换模型.一般离摄像机近的时候显示高模,离摄像机远的时候显示低模,借此来提升性能. 如果你在Blend ...

  4. Contest 985

    A 均移到黑色或白色即可. 时间复杂度 \(O\left(n\log n\right)\). B 枚举每种开关判断是否有灯只能靠该种开关控制. 时间复杂度 \(O\left(nm\right)\). ...

  5. LeetCode周赛#212

    1631. 最小体力消耗路径 #并查集 #最短路径 题目链接 题意 给定一二维 rows x columns 的地图 heights ,其中 heights[row][col] 表示格子 \((row ...

  6. 企业安全06-Fastjson-CNVD-2017-02833

    Fastjson-CNVD-2017-02833 一.漏洞概述 fastjson在解析json的过程中,支持使用@type字段来指定反序列化的类型,并调用该类的set/get方法来访问属性,当组件开启 ...

  7. Mybatis学习-初步认知与使用

    Mybatis是一款优秀的持久层框架.且支持定制化SQL,存储过程以及高级映射 Mybatis几乎免除了所有的JDBC代码以及设置参数和获取结果集的工作,它使用简单的XML或注解来配置原始类型.接口和 ...

  8. sqli-labs-master less02-04

    sql注入0-4关只存在注入方式的区别 第一关 ?id=1'--+ ' 第二关 ?id=1--+ 无 第三关 ?id=1')--+ ') 第四关 ?id=1")--+ ") 过程同 ...

  9. 使用wapiti进网站进行安全性测试

    1.安装wapiti --在命令终端输入 pip install wapiti3 (因为这个结合python使用,所以安装的版本要跟python兼容,因为我的python是3.6版本,所以安装的是wa ...

  10. SAD DNS--新型DNS缓存中毒攻击

    一.DNS基础知识: 1.DNS简介: DNS 域名服务,用于建立 域名与 ip地址的 一对一 映射.DNS 将域名转换为 IP地址,以便浏览器能够加载 Internet 资源. 类似于一个翻译系统, ...