#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分治可以将三维变两维, 两次的话就变成一维了, 然 ...
随机推荐
- Flutter学习(一)——创建一个项目
本文基于 flutter 2.5.1,开发工具 Visual Studio Code. 一.创建 打开 VS Code 点击 View > Command Palette-(快捷键command ...
- You can't specify target table for update in FROM clause
mysql中You can't specify target table for update in FROM clause错误的意思是说,不能先select出同一表中的某些值,再update这个表( ...
- hibernate-delete(Entity)的顺序问题
hibernate为我们提供了删除直接根据实体参数删除数据的方法: HibernateTemplate().delete(entity); public void delete(final Objec ...
- 【Azure 应用服务】Python3.7项目在引用pandas 模块后,部署报错
问题描述 参考"快速入门:在 Linux 上的 Azure 应用服务中创建 Python 应用" 文档,在App Service For Linux环境中部署Python应用,在添 ...
- Java 常用类 String的常用方法(1)
1 package com.bytezero.stringclass; 2 3 import org.junit.Test; 4 5 import java.sql.SQLOutput; 6 impo ...
- Codeforces(1500板刷)
目录 写在前面 1. A. Did We Get Everything Covered?(构造.思维) 题目链接 题意 题解 代码 总结 2 F. Greetings(离散化+树状数组) 题目链接 题 ...
- SPFA最短路
目录 从Bellman-Ford开始 核心思想 模拟算法执行过程 时间复杂度 模板 spfa spfa优化的思想 模板 从Bellman-Ford开始 对于所有边权都大于等于0的图,任意两个顶点之间的 ...
- 网络流与各种建模(I)
网络流与各种建模(I) 网络流基础 这里默认读者学习过网络流和MCMF,这里仅作复习 网络流解决的问题是给一个源点和汇点,每个边有最大流量,最大化从源点放水到汇点的速率. 网络流的时间复杂度是 \(O ...
- 选择单词后 按 ctrl + space 单词发音
需求: 在ide或其他地方,经常有单词发音不是很确定,但并不要很详细 就听个单词发音. 确定快捷键: 左手单手操作,我键盘上貌似就 左边的ctrl和空格键 还没有设定 翻译软件: 使用 pc端的 欧路 ...
- C#实现一个简单的日志类
目录 自定义日志类 NLog版本的日志类 Serilog版本的日志类 上个月换工作,新项目又要重新搭建基础框架,把日志实现部分单独记录下来方便以后参考. 自定义日志类 代码大部分使用ChatGPT生成 ...