K - 回转寿司(值域段数(板题) + 动态开点)
回转寿司
Description
酷爱日料的小Z经常光顾学校东门外的回转寿司店。在这里,一盘盘寿司通过传送带依次呈现在小Z眼前。不同的寿
司带给小Z的味觉感受是不一样的,我们定义小Z对每盘寿司都有一个满意度,例如小Z酷爱三文鱼,他对一盘三文
鱼寿司的满意度为10;小Z觉得金枪鱼没有什么味道,他对一盘金枪鱼寿司的满意度只有5;小Z最近看了电影“美
人鱼”,被里面的八爪鱼恶心到了,所以他对一盘八爪鱼刺身的满意度是-100。特别地,小Z是个著名的吃货,他
吃回转寿司有一个习惯,我们称之为“狂吃不止”。具体地讲,当他吃掉传送带上的一盘寿司后,他会毫不犹豫地
吃掉它后面的寿司,直到他不想再吃寿司了为止。今天,小Z再次来到了这家回转寿司店,N盘寿司将依次经过他的
面前,其中,小Z对第i盘寿司的满意度为Ai。小Z可以选择从哪盘寿司开始吃,也可以选择吃到哪盘寿司为止,他
想知道共有多少种不同的选择,使得他的满意度之和不低于L,且不高于R。注意,虽然这是回转寿司,但是我们不
认为这是一个环上的问题,而是一条线上的问题。即,小Z能吃到的是输入序列的一个连续子序列;最后一盘转走 之后,第一盘并不会再出现一次。Input
第一行包含三个整数N,L和R,分别表示寿司盘数,满意度的下限和上限。 第二行包含N个整数Ai,表示小Z对寿司的满意度。
N≤100000,|Ai|≤100000,0≤L, R≤10^9 Output仅一行,包含一个整数,表示共有多少种选择可以使得小Z的满意度之和 不低于L且不高于R。 Sample Input
5 5 9
1 2 3 4 5
Sample Output
6
铺垫知识
值域线段树
- 定义:值域线段是是用来 统计插入到[ l , r] 区域内的元素的个数,值域线段树每一个节点代表一个值,其他与普通线段树没什么区别。
动态开点
- 作用:在一颗线段树中,我们在不断插入点\访问区间的时候,我们可能不会在所有的区间插入数值、可能不会访问到所有的区间,那么我们就没必要给线段一下子开满空间,我们只需要在访问某个区间的时候把这个区间建立出来就行了,这样就节省了空间。
- 使用情况: 根据它节省空间的作用,我们就可看出它明显使用在 直接建立线段树空间不够的情况。
- 附上动态开点过程图:
红框中是我们将要访问到那个子节点就动态建立那个子节点区间,而其他部分则是不存在的
- 动态开点核心代码:
ll tree[Len], lson[Len],rson[Len];
int tot = 0; //当前总共的节点的个数
ll root = 1; //初始节点从1开始
int newnode()
{
++ tot;
tree[tot] = lson[tot] = rson[tot] = 0;
return tot;
}
本题思路
- 题意:这一是让起有多少个子区间的和是在所给限制范围【L, R】直接。
- 思路:那么我们可以可以用前缀和来维护连续区间和,但是直接求的话一定会T,首先我们可以列出这个不等式:
L <= sum[r] - sum[l - 1] <= R,l < r
, 我们可以对这个不等式进行变化为sum[r] - R <= sum[l - 1] <= sum[r] - L
, 这样我们就可以不断的查询[ sum[ r ] - R, sum[ r ] - L ]
,这个区间内符合题意的sum[ l - 1]
的数量就行了,最后有一点要注意到,由于 l < r 但我们查询sum[r] - R <= sum[l - 1] <= sum[r] - L
这个区间的时候我们已经把 位于 r 之前的所有可能的sum[ l ] 已经更新过了,这样就保证了我们要查询那个区间,那个区间内的所有树都确保已经被更新过了。 - 最中后 请注意一下:
我们要更新的 sum[l - 1] 中的 l - 1 的范围
,因为是由于 sum维护的是前缀和,所以 r 的范围是[1, n],又因为 l < r, 所以 l - 1 的范围是 [0, n - 1] , 所以我们更新的范围是sum[0]、sum[1]、sum[2].....sum[n - 1]
。
题解
#include<iostream>
#include<cstdio>
using namespace std;
#define INF 1e10
#define ll long long
const int maxn = 100005;
const int Len = 1e7 + 5;
ll sum[maxn];
ll tree[Len], lson[Len],rson[Len]; //注意左右儿子数组存储的是 子区间的tree数组下标
int tot = 0;
ll root = 1;
int newnode()
{
++ tot;
tree[tot] = lson[tot] = rson[tot] = 0;
return tot;
}
void Update(ll & rt, ll l, ll r, ll val) //请千万⚠️ 这一行里面的引用!!!
{
if(! rt)
rt = newnode();
tree[rt] ++;
if(l == r) return;
ll m = (l + r) >> 1;
if(val <= m) Update(lson[rt], l, m, val);
else Update(rson[rt], m+1, r, val);
}
ll Query(ll rt, ll l, ll r, ll s, ll e)
{
if(s <= l && r <= e)
return tree[rt];
ll m = (l + r) >> 1;
ll res = 0;
if(s <= m) res += Query(lson[rt], l, m, s, e);
if(e > m) res += Query(rson[rt], m+1,r, s, e);
return res;
}
int main()
{
//freopen("A.txt","r",stdin);
int n, l, r;
scanf("%d %d %d", &n, &l, &r);
for(int i = 1; i <= n; i ++)
scanf("%lld", &sum[i]), sum[i] += sum[i - 1];
ll ans = 0;
Update(root, -INF, INF, 0);
for(int i = 1; i <= n; ji ++)
{
ans += Query(root, -INF, INF, sum[i] - r, sum[i] - l);
Update(root, -INF, INF, sum[i]);
}
printf("%lld\n", ans);
return 0;
}
K - 回转寿司(值域段数(板题) + 动态开点)的更多相关文章
- W同学的新画板 QDUOJ 线段树 区间颜色段数
W同学的新画板 QDUOJ 线段树 区间颜色段数 原题链接 题意 W同学在每天的刻苦学习完成功课之余,都会去找一些有趣的事情来放松自己:恰巧今天他收到了朋友送给他的一套画板,于是他立刻拆开了包装,拿出 ...
- [BZOJ4627][BeiJing2016]回转寿司(线段树)
从左到右处理,设到当前数R的前缀和为cnt[i],则以i为右端点的合法的区间左端点j必然是L<=cnt[i]-cnt[j-1]<=R,即cnt[i]-R<=cnt[j-1]<= ...
- bzoj 4627: [BeiJing2016]回转寿司
4627: [BeiJing2016]回转寿司 Description 酷爱日料的小Z经常光顾学校东门外的回转寿司店.在这里,一盘盘寿司通过传送带依次呈现在小Z眼前.不同的寿 司带给小Z的味觉感受是不 ...
- [LOJ2736] [JOISC 2016 Day 3] 回转寿司 (分块+堆)
[LOJ2736] [JOISC 2016 Day 3] 回转寿司 (分块+堆) 题面 给出一个有n 个点的环,环上各点有一个初始权值 \(a_i\) 给出 Q 个询问,每次询问给出一个区间 [l,r ...
- bzoj2243树链剖分+染色段数
终于做了一道不是一眼出思路的代码题(⊙o⊙) 之前没有接触过这种关于染色段数的题目(其实上课好像讲过),于是百度了一下(现在思维能力好弱) 实际上每一段有用的信息就是总共有几段和两段各是什么颜色,在开 ...
- BZOJ_4627_[BeiJing2016]回转寿司_离散化+树状数组
BZOJ_4627_[BeiJing2016]回转寿司_离散化+树状数组 Description 酷爱日料的小Z经常光顾学校东门外的回转寿司店.在这里,一盘盘寿司通过传送带依次呈现在小Z眼前.不同的寿 ...
- 【凸包板题】Gym - 101484E E. Double Fence
http://codeforces.com/gym/101484/problem/E 题解 凸包板题 #define _CRT_SECURE_NO_WARNINGS #include<cmath ...
- Oil Skimming HDU - 4185(匹配板题)
Oil Skimming Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- bzoj 4627: [BeiJing2016]回转寿司 -- 权值线段树
4627: [BeiJing2016]回转寿司 Time Limit: 10 Sec Memory Limit: 256 MB Description 酷爱日料的小Z经常光顾学校东门外的回转寿司店. ...
随机推荐
- 一起学习vue源码 - Object的变化侦测
作者:小土豆biubiubiu 博客园:www.cnblogs.com/HouJiao/ 掘金:https://juejin.im/user/58c61b4361ff4b005d9e894d 简书:h ...
- GPS北斗NTP校时服务器原理及功能介绍
在科技的发展下GPS北斗NTP校时服务器也得到了广泛应用,比如工业.科研.航空航天.公共场所等领域都用到了GPS北斗NTP校时服务器,该时间服务器以卫星时间为基准授时准确,替代了传统钟表授时的单一和时 ...
- 【图文+视频新手也友好】Java一维数组详细讲解(内含练习题答案+详解彩蛋喔~)
目录 视频讲解: 一.数组的概述 二.一维数组的使用 三.Arrays工具类中的sort方法(sort方法用的多,我们具体讲一下) 四.数组中的常见异常 五.一维数组练习题 六.彩蛋(本期视频使用的P ...
- ElasticSearch之映射常用操作
本文案例操作,建议先阅读我之前的文章<ElasticSearch之安装及基本操作API> Mapping (映射)类似关系型数据库中的表的结构定义.我们将数据以 JSON 格式存入到 El ...
- 详解聚类算法Kmeans的两大优化——mini-batch和Kmeans++
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第13篇文章,我们来看下Kmeans算法的优化. 在上一篇文章当中我们一起学习了Kmeans这个聚类算法,在算法的最后我 ...
- 一个简单的方法去掉angular application中URLs的hashtag
本文转载自:Pretty URLs in AngularJS: Removing the # By default, AngularJS will route URLs with a hashtag. ...
- SSL/TLS 安全测试
本文介绍了使用半自动化工具执行SSL&TLS安全性评估的过程,以及如何使用手动及工具的测试方法验证并发现问题.目的是优化TLS和SSL安全测试流程,帮助信息安全顾问在渗透测试时在TLS / S ...
- session生命周期,与cookie的区别
sessinon在用户访问第一次访问服务器时创建. Session什么时候失效? 1. 服务器会把长时间没有活动的Session从服务器内存中清除,此时Session便失效.Tomcat中Sessio ...
- vue 2
目录 复习 今日 指令 条件指令 循环指令 评论案例 解决插值表达式符号冲突 总结 组件 局部组件 全局组件 组件间的交互:父传子 组件间的交互:子传父 复习 """ 1 ...
- 【2019南昌网络赛】B-Fire-Fighting Hero
题目链接 分析 英雄方面很简单,跑一遍 Dijkstra 就行了,但是灭火团队就有点麻烦了. 这里可以借助一下最大流的建边来解决这个问题: 我们可以另外找一个点作为起点,然后建立从那个点到每一个团队的 ...