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. 谷歌Colab使用(深度学习)

    1. Coalb简介 Google Colaboratory是谷歌开放的一款研究工具,主要用于机器学习的开发和研究.这款工具现在可以免费使用,但是不是永久免费暂时还不确定.Google Colab最大 ...

  2. 死磕以太坊源码分析之Kademlia算法

    死磕以太坊源码分析之Kademlia算法 KAD 算法概述 Kademlia是一种点对点分布式哈希表(DHT),它在容易出错的环境中也具有可证明的一致性和性能.使用一种基于异或指标的拓扑结构来路由查询 ...

  3. Android10_原理机制系列_Android消息机制(Handler)详述

    概述 在Android中的多进程.多线程中提过,只有主线程(UI线程)可以更新UI,其他线程不可以,所以一般耗时操作放到子线程.子线程可以通过Handler将相关信息通知到主线程. Android的消 ...

  4. NPOT纹理与平铺模式OpenGL规范

    OpenGL规范从2.0开始支持显示边长为非2次幂的Texture,但限制条件是需要环绕模式为CLAMP_TO_EDGE并且过滤模式为NEAREST或者LINEAR. 解除限制的条件是硬件支持OES_ ...

  5. Linux内核剖析——操作系统的启动

    一.总体功能 1.从通电到BIOS跳转 1.1 CPU在通电后,先进入实模式,设置CS=0XFFFF,IP = 0X0000(指向BIOS) 1.2 BIOS进行执行系统监测,并且在地址=0处初始化中 ...

  6. ABBYY FineReader 15快速转换文档详解

    作为一款专业的"PDF编辑器",用户可通过使用ABBYY FineReader  15的"快速转换"功能,将各种格式的一个或多个文件合并PDF文档.Micros ...

  7. Golang 实现 Redis(7): Redis 集群与一致性 Hash

    本文是使用 golang 实现 redis 系列的第七篇, 将介绍如何将单点的缓存服务器扩展为分布式缓存.godis 集群的源码在Github:Godis/cluster 单台服务器的CPU和内存等资 ...

  8. centons 7 清机 脚本

    #/bin/bash##################################初始化系统###################setenforce 0 yum install -y yum- ...

  9. Java设计模式——观察者模式的灵活应用

    灵感来源于一个猪队友给我的题目 看到这个,我抓住的关键字是:任何子任务失败,要通知所有子任务执行取消逻辑. 这不就是消息广播吗?观察者模式! 干活 首先是收听者 package com.example ...

  10. 在VMware下创建windows server 2008虚拟机

    1.创建新的虚拟机 打开VMware软件,点击主页内创建新的虚拟机 2.进入新建虚拟机向导 点击典型,点击下一步 3.在下一步中单击稍后安装操作系统 点击下一步 4.选择操作系统类型 客户机操作系统选 ...