题目链接:点击这里

PS:之前这个题是用动态开点的权值线段树写的,后来看到有大佬有cdq分治解决了这个问题,于是来学习记录一下这种解法,以加深对cdq分治的理解

题目大意:
给定一个长度为 nnn 的序列 ,现在要从中选出一段连续子序列 [l,r][l,r][l,r] ,使得 L≤∑i=lrai≤RL \le \sum^r_{i = l}a_i \le RL≤∑i=lr​ai​≤R ,求符合条件的子序列数量

题目分析:
记 sumx=∑i=1xaisum_x=\sum^x_{i=1}a_isumx​=∑i=1x​ai​ ,故 ∑i=lrai=sumr−suml−1\sum^r_{i=l}a_i=sum_r-sum_{l-1}∑i=lr​ai​=sumr​−suml−1​,故式子 L≤∑i=lrai≤RL \le \sum^r_{i = l}a_i \le RL≤∑i=lr​ai​≤R 可化为 L≤sumr−suml−1≤RL \le sum_r-sum_{l-1} \le RL≤sumr​−suml−1​≤R 这个式子可以分成 L≤∑i=lraiL \le \sum^r_{i = l}a_iL≤∑i=lr​ai​ 和 ∑i=lrai≤R\sum^r_{i = l}a_i \le R∑i=lr​ai​≤R 两部分通过 O(n)O(n)O(n) 的单调队列维护,于是便可以用cdq分治的思想解决这个问题了
时间复杂度 O(nlog2n)O(nlog^2n)O(nlog2n)

具体细节见代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#define ll long long
#define inf 0x3f3f3f3f
#define Inf 0x3f3f3f3f3f3f3f3f
using namespace std;
ll read()
{ll res = 0,flag = 1;char ch = getchar();while(ch<'0' || ch>'9'){if(ch == '-') flag = -1;ch = getchar();}while(ch>='0' && ch<='9'){res = (res<<3)+(res<<1)+(ch^48);//res*10+ch-'0';ch = getchar();}return res*flag;
}
const int maxn = 1e5+5;
const int mod = 1e9+7;
const double pi = acos(-1);
const double eps = 1e-8;
ll n,L,R,ans,sum[maxn];
void cdq(int l,int r)
{if(l == r) return ;int mid = (l+r)>>1;cdq(l,mid);cdq(mid+1,r);int head = l,tail = l-1;for(int i = mid+1;i <= r;i++){while(tail < mid && sum[i]>=sum[tail+1]+L) tail++;while(head <= mid && sum[i]>sum[head]+R) head++;ans += tail-head+1;}sort(sum+l,sum+r+1);
}
int main()
{n = read(),L = read(),R = read();for(int i = 1;i <= n;i++){ll x = read();sum[i] = sum[i-1]+x;}cdq(0,n);printf("%lld\n",ans);return 0;
}

P5459 [BJOI2016]回转寿司 (cdq分治)相关推荐

  1. (线段树)P5459 [BJOI2016]回转寿司

    P5459 [BJOI2016]回转寿司 添加链接描述https://www.luogu.com.cn/problem/P5459 思路:题目意思就是求出有多少个区间和在L~R范围内,这符合线段树的区 ...

  2. [BZOJ4627][BeiJing2016]回转寿司 cdq分治

    怎么短怎么写对吧,cdq分治代替数据结构 把区间连续的看成前缀和相减,排序单调队列维护即可 注意sum[0] /******************************************** ...

  3. 洛谷 P5459 [BJOI2016]回转寿司 【CDQ分治】

    题目链接 题意 给出一个序列,求有几个子段和 sumsumsum 满足L≤sum≤RL \le sum \le RL≤sum≤R 题解 设 pren=∑i=1naipre_n=\sum_{i=1}^{ ...

  4. P5459 [BJOI2016]回转寿司(动态开点)

    传送门 求R>=pre[r]−pre[l−1]>=LR>=pre[r]-pre[l-1]>=LR>=pre[r]−pre[l−1]>=L 就是pre[r]−R< ...

  5. BZOJ 4627: [BeiJing2016]回转寿司 cdq

    4627: [BeiJing2016]回转寿司 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 624  Solved: 273 [Submit][S ...

  6. BZOJ4627: [BeiJing2016]回转寿司

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

  7. 【BZOJ-3456】城市规划 CDQ分治 + NTT

    题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=3456 Solution 这个问题可以考虑dp,利用补集思想 N个点的简单图总数量为$2^{ ...

  8. BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )

    考虑cdq分治, 对于[l, r)递归[l, m), [m, r); 然后计算[l, m)的操作对[m, r)中询问的影响就可以了. 具体就是差分答案+排序+离散化然后树状数组维护.操作数为M的话时间 ...

  9. bzoj2961 共点圆 (CDQ分治, 凸包)

    /* 可以发现可行的圆心相对于我们要查询的点是在一个半平面上, 然后我们要做的就是动态维护凸壳然后用这个半平面去切它 看看是否是在合法的那一面然后cdq分治就可以了代码基本是抄的,*/#include ...

最新文章

  1. 10 分钟快速入门海量数据搜索分析引擎 Elasticearch
  2. 详解Eureka服务注册与发现和Ribbon负载均衡【纯理论实战】
  3. Statement与PreparedStatement的区别
  4. CAN总线技术 | CAN脱颖而出的“秘密”
  5. Linux文本编辑器之vim
  6. html5播放视频自动循环播放,HTML5 通过Vedio标签实现视频循环播放的示例代码
  7. swiper动态加载数据滑动失效,ajax执行后swiper.js的效果消失问题
  8. delphi连接mysql不用添加dsn_jsp中有没有像asp的非DSN连接数据库方法呢?(20分)
  9. 把“TCP/IP”协议讲明白
  10. 合作博弈:夏普利值(shapley value)性质与算法
  11. UI设计中的“吐司”是什么意思?
  12. MATLAB命令行窗口常见命令与功能
  13. 网线:568A 568B线序
  14. python中compile函数
  15. 谷物割捆一体农用车系统整体设计
  16. 聊聊如何申请技术专利
  17. 51nod 1740蜂巢迷宫
  18. 跑步戴什么耳机比较好、精挑五款最佳跑步耳机推荐
  19. 插入图片的时候,总是只是能漏出一点点其他部分都看不到,改变格式从插入型改成浮于文字上方才能完全显示,但浮于文字上方的格式最后不好排版和编辑,稍微一改,整个就乱了,求助如何让插入型的文字图片完全显示出来
  20. 基于ACCESS的教师工作量计算系统的设计与实现(含源文件)

热门文章

  1. 内容抄袭检查器 X 2022| Plagiarism Checker
  2. JavaScript实现心形div块跟随鼠标移动(幻影效果)
  3. 电影《铃芽之旅》观后感
  4. windows云服务器部署web网站
  5. sqlbulkcopy是覆盖式更新吗_名录式的管理,能保护好黄河鱽鱼吗?写在《国家重点保护野生动物名录》首次更新之际...
  6. 计算机c盘属性不显示安全选项,Win10系统下磁盘属性没有安全选项卡怎么解决?...
  7. 美团点评2020校招笔试 2019.08.22
  8. java文件转换成字节
  9. 时钟晶振在电子日历上的作用!
  10. mysql介绍——基础知识