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

#include <bits/stdc++.h>
using namespace std; //Start
typedef long long ll;
typedef double db;
#define mp(a,b) make_pair(a,b)
#define x(a) a.first
#define y(a) a.second
#define b(a) a.begin()
#define e(a) a.end()
#define sz(a) int((a).size())
#define pb(a) push_back(a)
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f; //Data
const int N=1e6;
int n,m,a[N+7],ql[N+7],qr[N+7];
int l[N+7],r[N+7];
vector<pair<int,int> > st[N+7];
ll ans[N+7];
typedef vector<ll> bit;
bit cnt,sm;
void add(bit&c,int x,ll y){for(;x<sz(c);x+=x&-x) c[x]+=y;}
ll sum(bit&c,int x){ll y=0;for(;x;x-=x&-x) y+=c[x];return y;}
ll sum(bit&c,int x,int y){return sum(c,y)-sum(c,x-1);} //Main
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=m;i++) scanf("%d",&ql[i]),st[ql[i]-1].pb(mp(i,-1));
for(int i=1;i<=m;i++) scanf("%d",&qr[i]),st[qr[i]].pb(mp(i,1));
a[0]=a[n+1]=inf;
for(int i=1;i<=n;i++){l[i]=i-1;while(a[l[i]]<a[i]) l[i]=l[l[i]];}
for(int i=n;i>=1;i--){r[i]=i+1;while(a[r[i]]<a[i]) r[i]=r[r[i]];}
for(int i=1;i<=n;i++) l[i]++,r[i]--;
for(int i=1;i<=m;i++) ans[i]=qr[i]-ql[i]+1;
cnt=sm=bit(n+7,0);
for(int i=1;i<=n;i++){
add(cnt,l[i],1),add(sm,l[i],l[i]);
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);
}
cnt=sm=bit(n+7,0);
for(int i=1;i<=n;i++){
add(cnt,r[i],1),add(sm,r[i],r[i]);
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);
}
for(int i=1;i<=m;i++) printf("%lld%c",ans[i],"\n "[i<m]);
return 0;
}

祝大家学习愉快!

笔记-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. day05-类型转换和变量

    1.类型转换概念 java是强类型语言,所以有些运算的时候,需要用到类型转换 类型转换原则:低-->高,byte,short,char-->int-->long-->float ...

  2. 三:redis启动后的基础知识

    Redis启动后的杂项基础知识 1.单进进程 单进程模型来处理客户端的请求.对读写等事件的响应是通过对epoll函数的包装来做到的.Redis的实际处理速度完全依靠主进程的执行效率       Epo ...

  3. shell中if/seq/for/while/until

    1.if语句格式:  if 判断条件:then statement1 statement2 fi; 例子: 判断/test/a普通文件是否存在,存在则输出yes,不存在则输出no,并创建.  #! / ...

  4. 预估Ceph集群恢复时间

    一.前言 本章很简单,就是预估集群恢复的时间,这个地方是简单的通过计算来预估需要恢复的实际,动态的显示 二.代码 #!/usr/bin/env python # -*- coding: UTF-8 - ...

  5. Angular 之装饰器@Input

    Input 一个装饰器,用来把某个类字段标记为输入属性,并提供配置元数据. 该输入属性会绑定到模板中的某个 DOM 属性.当变更检测时,Angular 会自动使用这个 DOM 属性的值来更新此数据属性 ...

  6. C#推流RTMP,摄像头、麦克风、桌面、声卡(附源码)

    这段时间一直都在研究推流的技术,经过断断续续将近两个月的摸索实践,终于能稳定地推流了. 这个demo的主要功能就是将采集到的摄像头或桌面的视频.以及麦克风或声卡的音频数据推到Nginx-RTMP服务器 ...

  7. c#多播委托判断空值

    int resualt = (int)fn?.Invoke(a, b); 其中fn是有两个参数一个int返回值的多播委托,这个看起来很精炼,大概意思也不懂 个人理解为使用先判断fn?,再传值以及输出为 ...

  8. 你也想当流量UP主?那就点开看看吧!

    2009年6月份,哔哩哔哩(B站)在一众期待中诞生,它汇聚了天南海北当时小众的二次元同好,它也存在诸多不足,大家亲切地叫它"小破站". 而如今,它成长为一棵枝繁叶茂的参天大树,成为 ...

  9. ABBYY FineReader 15 PDF文档查看功能

    PDF文档查看功能是ABBYY FineReader 15(Windows系统)OCR文字识别软件中PDF编辑器的一项基础功能,可供用户查看,搜索PDF文档,无需进入编辑模式,也可复制其中的文本,图片 ...

  10. MindManager中主题间距/线条粗细的灵活调整

    在MindManager中,主题和线条是思维导图的基本元素,只有通过它们才能将要表达的思想呈现.并联系起来.因此,关于它们的属性设置就会多一点,如颜色.宽度.位置等.而调整主题之间的距离及线条的粗细, ...