#cdq分治,树状数组#洛谷 5459 [BJOI2016]回转寿司
题目
求
\]
分析(树状数组)
考虑前缀和,改为是否有两个数的差在\([L\sim R]\)范围内,
显然可以用树状数组做,记录\(a_i,a_i-L,a_i-R\),离散化
代码(树状数组)
#include <cstdio>
#include <cctype>
#include <algorithm>
#define rr register
using namespace std;
typedef long long lll;
const int N=100011;
lll a[N],b[N*3],ans;
int c[N*3],n,L,R,Tot;
inline signed iut(){
rr int ans=0,f=1; rr char c=getchar();
while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans*f;
}
inline void update(int x){for (;x<=Tot;x+=-x&x) ++c[x];}
inline signed query(int l,int r){
rr int ans=0; --l;
for (;r>l;r-=-r&r) ans+=c[r];
for (;l>r;l-=-l&l) ans-=c[l];
return ans;
}
signed main(){
n=iut(),L=iut(),R=iut(),Tot=1;
for (rr int i=1;i<=n;++i){
a[i]=a[i-1]+iut(),b[++Tot]=a[i],
b[++Tot]=a[i]-L,b[++Tot]=a[i]-R;
}
sort(b+1,b+1+Tot),Tot=unique(b+1,b+1+Tot)-b-1;
update(lower_bound(b+1,b+1+Tot,0)-b);
for (rr int i=1;i<=n;++i){
rr int fi=lower_bound(b+1,b+1+Tot,a[i]-R)-b,
se=lower_bound(b+1,b+1+Tot,a[i]-L)-b,
th=lower_bound(b+1,b+1+Tot,a[i])-b;
ans+=query(fi,se);
update(th);
}
return !printf("%lld",ans);
}
分析(cdq分治)
同理可以在cdq分治中用双指针找到\(a_i-R,a_i-L\)的位置,然后统计答案
代码
#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
typedef long long lll;
const int N=100011;
lll a[N],n,ans,b[N],L,R;
inline signed iut(){
rr int ans=0,f=1; rr char c=getchar();
while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans*f;
}
inline void cdq(int l,int r){
if (l==r) return;
rr int mid=(l+r)>>1;
cdq(l,mid),cdq(mid+1,r);
for (rr int i=mid+1,hl=l,hr=l-1;i<=r;++i){
while (hr<mid&&a[i]-L>=a[hr+1]) ++hr;//使刚好a[hr+1]>a[i]-L
while (hl<=mid&&a[i]-R>a[hl]) ++hl;//使a[hl]>=a[i]-R
ans+=hr-hl+1;//为什么不会出现负数,因为首先a[i]-L>=a[i]-R,所以hr-hl>=-1,加上1正好抵消掉
}
rr int i1=l,j1=mid+1,tot=0;
while (i1<=mid&&j1<=r)
if (a[i1]<=a[j1]) b[++tot]=a[i1],++i1;
else b[++tot]=a[j1],++j1;
while (i1<=mid) b[++tot]=a[i1],++i1;
while (j1<=r) b[++tot]=a[j1],++j1;
for (rr int i=1;i<=tot;++i) a[l+i-1]=b[i];
}
signed main(){
n=iut(),L=iut(),R=iut();
for (rr int i=1;i<=n;++i) a[i]=a[i-1]+iut();
cdq(0,n);//a[0]也需要算进去
return !printf("%lld",ans);
}
#cdq分治,树状数组#洛谷 5459 [BJOI2016]回转寿司的更多相关文章
- 【BZOJ4553】[Tjoi2016&Heoi2016]序列 cdq分治+树状数组
[BZOJ4553][Tjoi2016&Heoi2016]序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能 ...
- BZOJ 1176 Mokia CDQ分治+树状数组
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1854 Solved: 821[Submit][St ...
- 【bzoj3262】陌上花开 CDQ分治+树状数组
题目描述 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当且仅当Sa&g ...
- 【bzoj2225】[Spoj 2371]Another Longest Increasing CDQ分治+树状数组
题目描述 给定N个数对(xi, yi),求最长上升子序列的长度.上升序列定义为{(xi, yi)}满足对i<j有xi<xj且yi<yj. 样例输入 8 1 3 3 2 1 1 4 5 ...
- BZOJ 2683 简单题 cdq分治+树状数组
题意:链接 **方法:**cdq分治+树状数组 解析: 首先对于这道题,看了范围之后.二维的数据结构是显然不能过的.于是我们可能会考虑把一维排序之后还有一位上数据结构什么的,然而cdq分治却可以非常好 ...
- LOJ3146 APIO2019路灯(cdq分治+树状数组)
每个时刻都形成若干段满足段内任意两点可达.将其视为若干正方形.则查询相当于求历史上某点被正方形包含的时刻数量.并且注意到每个时刻只有O(1)个正方形出现或消失,那么求出每个矩形的出现时间和消失时间,就 ...
- BZOJ 4553 [Tjoi2016&Heoi2016]序列 ——CDQ分治 树状数组
考虑答案的构成,发现是一个有限制条件的偏序问题. 然后三个维度的DP,可以排序.CDQ.树状数组各解决一维. #include <map> #include <cmath> # ...
- BZOJ1176---[Balkan2007]Mokia (CDQ分治 + 树状数组)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1176 CDQ第一题,warush了好久.. CDQ分治推荐论文: 1 <从<C ...
- Hdu4742-Pinball Game 3D(cdq分治+树状数组)
Problem Description RD is a smart boy and excel in pinball game. However, playing common 2D pinball ...
- hdu 5126 stars cdq分治套cdq分治+树状数组
题目链接 给n个操作, 第一种是在x, y, z这个点+1. 第二种询问(x1, y1, z1). (x2, y2, z2)之间的总值. 用一次cdq分治可以将三维变两维, 两次的话就变成一维了, 然 ...
随机推荐
- windows下的批处理bat文件和Linux下的shell文件的含义
原文:https://www.cnblogs.com/caiguodong/p/10308255.html shell(Linux.Solaris) bat(windows) 含义 # rem 注释行 ...
- 【Azure App Service for Linux】Linux Web App如何安装系统未安装的包
问题描述 Linux Web App中如何安装系统默认未安装的包,如何来执行如 apt install XXX命令呢?现在遇见的问题时,通过Azure App Service门户中的SSH登录后,执行 ...
- docker知识整理(备份)
概念: 镜像:Docker 镜像类似于虚拟机镜像,可以将它理解为一个只读的模板 .镜像是创建 Docker 容器的基础.通过版本管理和增量的文件系统, Docker 提供了一套十分简单的机制来创建和更 ...
- 手把手教你python数据处理项目——探索ebay汽车销售数据
探索Ebay汽车销售数据 一.实验目的 1. 熟悉清理数据的流程: 2. 分析Ebay二手车销售数据: 3. 了解jupyter notebook为pandas提供的一些独特特性. 二.实验开发环 ...
- linux服务器文件实时同步
linux服务器文件实时同步 1 背景说明 在做系统集群部署时,涉及到两个或多个服务器之间文件同步.在软件层面linux服务环境找到以下两种同步方式 利用linux NFS功能将网络共享文件挂载成本地 ...
- 【aspose-words】Aspose.Words for Java模板语法详细剖析
前言 缘由 aspose-words模板语法再了解 垂死病中惊坐起,小丑竟是我自己.对于aspose-words的使用本狗自以为已炉火纯青,遂在新的迭代任务中毛遂自荐,并在小姐姐面前吹了一个大牛,分分 ...
- 5. JVM虚拟机栈
1.概述 说到jvm 其中让人印象最深的就是栈和堆,也是 jvm中占用内存最大的两个地方. 从宏观上来看栈是运行时的单位,而堆是存储的单位 ,栈解决程序的运行问题,即程序如何执行,或者说如何处理数据. ...
- gRPC入门学习之旅(一)
gRpc简介 gRPC 是Google公司开发的基于HTTP/2设计,面向移动的一个高性能.开源和通用的 RPC 框架,是一款语言中立.平台中立.开源的远程过程调用(RPC)系统. gRpc官网地址: ...
- 开源好用的所见即所得(WYSIWYG)编辑器:Editor.js
@ 目录 特点 基于区块 干净的数据 界面与交互 插件 标题和文本 图片 列表 Todo 表格 使用 安装 创建编辑器实例 配置工具 本地化 自定义样式 今天介绍一个开源好用的Web所见即所得(WYS ...
- USB数据传输与手机授权:充电宝常规使用不需要授权
概述 此篇为解答充电宝骗局问题,骗局概述:两个人做局,以充测试充电宝是否损坏为由,插到受骗者手机上,受骗者允许了手机弹出的授权请求后,偷偷将病毒注入手机. Q:什么情况下手机会弹出授权? A:手机用数 ...