Recursive Queries


\[m_{l,r}=\textrm{id}(\max_{i=l}^r a_i)\\
f(l,r)=
\begin{cases}
(r-l+1)+f(l,m_{l,r}-1)+f(m_{l,r}+1,r)&\textrm{if } l\le r\\
0&\textrm{else}\\
\end{cases}
\]

设 \(L_i=\max\{j\}(j<i,a_j>a_i)\),\(R_i=\min\{j\}(j>i,a_j>a_i)\)。

考虑每个 \(i\in[l,r]\) 成为 \(m_{L_i+1,R_i-1}\) 时对答案的贡献:

\[\textrm{len}\Big([\max(l,L_i+1),\min(r,R_i-1)]\Big)
\]
\[\therefore f(l,r)=\sum_{i=l}^r\min(r,R_i-1)-\max(l,L_i+1)+1
\]

Code

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. //Start
  4. typedef long long ll;
  5. typedef double db;
  6. #define mp(a,b) make_pair(a,b)
  7. #define x(a) a.first
  8. #define y(a) a.second
  9. #define b(a) a.begin()
  10. #define e(a) a.end()
  11. #define sz(a) int((a).size())
  12. #define pb(a) push_back(a)
  13. const int inf=0x3f3f3f3f;
  14. const ll INF=0x3f3f3f3f3f3f3f3f;
  15. //Data
  16. const int N=1e6;
  17. int n,m,a[N+7],ql[N+7],qr[N+7];
  18. int l[N+7],r[N+7];
  19. vector<pair<int,int> > st[N+7];
  20. ll ans[N+7];
  21. typedef vector<ll> bit;
  22. bit cnt,sm;
  23. void add(bit&c,int x,ll y){for(;x<sz(c);x+=x&-x) c[x]+=y;}
  24. ll sum(bit&c,int x){ll y=0;for(;x;x-=x&-x) y+=c[x];return y;}
  25. ll sum(bit&c,int x,int y){return sum(c,y)-sum(c,x-1);}
  26. //Main
  27. int main(){
  28. scanf("%d%d",&n,&m);
  29. for(int i=1;i<=n;i++) scanf("%d",&a[i]);
  30. for(int i=1;i<=m;i++) scanf("%d",&ql[i]),st[ql[i]-1].pb(mp(i,-1));
  31. for(int i=1;i<=m;i++) scanf("%d",&qr[i]),st[qr[i]].pb(mp(i,1));
  32. a[0]=a[n+1]=inf;
  33. for(int i=1;i<=n;i++){l[i]=i-1;while(a[l[i]]<a[i]) l[i]=l[l[i]];}
  34. for(int i=n;i>=1;i--){r[i]=i+1;while(a[r[i]]<a[i]) r[i]=r[r[i]];}
  35. for(int i=1;i<=n;i++) l[i]++,r[i]--;
  36. for(int i=1;i<=m;i++) ans[i]=qr[i]-ql[i]+1;
  37. cnt=sm=bit(n+7,0);
  38. for(int i=1;i<=n;i++){
  39. add(cnt,l[i],1),add(sm,l[i],l[i]);
  40. for(auto j:st[i]) ans[x(j)]-=(sum(sm,ql[x(j)],qr[x(j)])+sum(cnt,1,ql[x(j)]-1)*ql[x(j)])*y(j);
  41. }
  42. cnt=sm=bit(n+7,0);
  43. for(int i=1;i<=n;i++){
  44. add(cnt,r[i],1),add(sm,r[i],r[i]);
  45. for(auto j:st[i]) ans[x(j)]+=(sum(sm,ql[x(j)],qr[x(j)])+sum(cnt,qr[x(j)]+1,n)*qr[x(j)])*y(j);
  46. }
  47. for(int i=1;i<=m;i++) printf("%lld%c",ans[i],"\n "[i<m]);
  48. return 0;
  49. }

祝大家学习愉快!

笔记-Recursive Queries的更多相关文章

  1. sql script: Graphs, Trees, Hierarchies and Recursive Queries

    --------------------------------------------------------------------- -- Inside Microsoft SQL Server ...

  2. sql server: Graphs, Trees, Hierarchies and Recursive Queries

    --------------------------------------------------------------------- -- Chapter 09 - Graphs, Trees, ...

  3. Codeforces 932.B Recursive Queries

    B. Recursive Queries time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  4. 前缀和:CodeForces 932B Recursive Queries

    Description Let us define two functions f and g on positive integer numbers. You need to process Q q ...

  5. Codeforces 1117G Recursive Queries [线段树]

    Codeforces 洛谷:咕咕咕 思路 设\(L_i,R_i\)为\(i\)左右第一个大于它的位置. 对于每一个询问\(l,r\),考虑区间每一个位置的贡献就是\(\min(r,R_i-1)-\ma ...

  6. 前缀和的应用 CodeForces - 932B Recursive Queries

    题目链接: https://vjudge.net/problem/1377985/origin 题目大意就是要你把一个数字拆开,然后相乘. 要求得数要小于9,否则递归下去. 这里用到一个递归函数: i ...

  7. Recursive Queries CodeForces - 1117G (线段树)

    题面: 刚开始想复杂了, 还以为是个笛卡尔树.... 实际上我们发现, 对于询问(l,r)每个点的贡献是$min(r,R[i])-max(l,L[i])+1$ 数据范围比较大在线树套树的话明显过不了, ...

  8. CF1117G Recursive Queries

    题意:给定一个序列,定义[l, r]的最大值在m处,求f(l, r) = f(l, m - 1) + (r - l + 1) + f(m + 1, r).多次询问.100w. 解:考虑这个区间内每个数 ...

  9. B. Recursive Queries 打表

    Code: #include<cstdio> #include<iostream> #include<algorithm> #include<cstring& ...

随机推荐

  1. Java 合并多个文件内容到一个文件(递归遍历某个文件夹下所有文件)

    这段代码通过Java I/O流API实现将多个文件合并到一个文件中,输出为文本文件,提供一个支持语法高亮的网站,http://www.codeinword.com/ 适合粘贴代码到word文档,小巧实 ...

  2. workerman搭建聊天室

    首先,先打开官网手册   http://doc.workerman.net/ 根据手册里安装里的提示,完成环境检测,和安装对应的扩展,并把对应的WorkerMan代码包下载解压至根目录 在根目录下创建 ...

  3. Camtasia中对录制视频进行编辑——交互性

    随着新媒体的广泛发展,视频处理的需要也逐渐变得越来越大,很多人都不知道市场上的哪款软件是比较符合大众需要的.有的软件功能写的天花乱坠,但是实际操作确很难.并不符合大众的简单需求. 今天我便给大家推荐一 ...

  4. MathType如何输入微分上的点

    作为被老师们青睐的公式编辑器,MathType可以帮助插入各种数学符号和编辑数学公式,从而提高数学试卷的编写效率.但是作为新手,在编辑公式的时候难免有困难,比如就有人问:如何输入微分上的点?其实也是有 ...

  5. 【PYTEST】第一章常用命令

    pytest入门 安装pytest 运行pytest pytest常用命令 1. 安装pytest pip install pytest 2. 运行pytest 2.1 pytest默认搜索当前目录下 ...

  6. Linux中配置环境变量

    Linux中环境变量的搭建(推荐用法) 第一步:进入到/etc/profile.d文件夹下 cd /etc/profile.d 第二步:创建并编辑一个my_env.sh文件 vim my_env.sh ...

  7. Mac 上超好用的代码对比工具 beyond compare,对比json差异

    导读 昨天下午,公司业务跑不通,然后开发组长让架构师联系我,给我发一个json和部署到dev上的微服务url,让我去测试下,将发来的json放到json.cn上愣是解析不出来,我就用之前的json请求 ...

  8. Java集合【4】-- iterable和Iterator的异同分析详解

    目录 一.iterator介绍 二.iterable接口 三.为什么有Iterator还需要Iterable 一.iterator介绍 iterator接口,也是集合大家庭中的一员.和其他的Map和C ...

  9. 一篇文章彻底搞懂Java的大Class到底是什么

    作者在之前工作中,面试过很多求职者,发现有很多面试者对Java的 Class 搞不明白,理解的不到位,一知半解,一到用的时候,就不太会用. 因为自己本身以前刚学安卓的时候,甚至做安卓2,3年后,也是对 ...

  10. Kafka入门之producer

    一些重要的参数: 1.acks指定了在给producer发送响应前,leader broker必须要确保已成功写入该消息的副本数.当前acks有3个取值,0,1,和all 2.buffer.memor ...