首页 > 其他分享 >牛客多校4.K.King of Range ST表+双指针

牛客多校4.K.King of Range ST表+双指针

时间:2022-10-28 10:34:56浏览次数:48  
标签:stmax King minn int mn 多校 stmin ST 区间


给定个整数和个询问,对于每个询问给定一个常数k,你需要找到有多少个区间满足序列的内所有元素​。注意序列无序。

​,显然需要一个高效​的算法,首先考虑双指针求解。

首先对于一段区间​,如果其区间最大值和区间最小值之差大于,那么当前区间可以产生​​个符合条件的区间:设分别表示当前区间的最大值、最小值,如果​​,那么说明该区间一定符合要求,那么包含该区间的区间也一定符合要求(值只会越来越小,值指挥越来越大),因此符合要求的区间数

那么我们可以每次固定区间左端点,右端点向后找到第一个满足区间最大值和区间最小值之差大于的点,然后将符合要求的区间数累加到答案中即可。

接下来考虑如何处理区间最大值最小值。考虑最优RMQ问题解决方案:ST表。因此可以建大小ST表,然后在上述过程中查询。

一开始左指针没控制好,WA了几发,心态爆炸。。。

#include <bits/stdc++.h>
using namespace std;

#define N 2000010

int stmax[N][22], stmin[N][22], mn[N];
int a[N];

int t, q, n, x, y;

void init(){
mn[0]=-1;
for (int i=1;i<=n;i++){
mn[i]=((i & (i-1))==0) ? mn[i-1]+1 : mn[i-1];
stmax[i][0]=stmin[i][0]=a[i];
}
for (int j=1;j<=mn[n];j++)
for (int i=1;i+(1<<j)-1<=n;i++){
stmax[i][j]=max(stmax[i][j-1],stmax[i+(1<<(j-1))][j-1]);
stmin[i][j]=min(stmin[i][j-1],stmin[i+(1<<(j-1))][j-1]);
}
}

int rmq_max(int L,int R){
int k=mn[R-L+1];
return max(stmax[L][k],stmax[R-(1<<k)+1][k]);
}

int rmq_min(int L,int R){
int k=mn[R-L+1];
return min(stmin[L][k],stmin[R-(1<<k)+1][k]);
}

signed main(){
cin >> n >> q;
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
init();
while (q--){
int k = 0; cin >> k;
long long ans = 0;
int l = 1, r = 0, maxn, minn;
while(l <= n){
r = max(r, l);
maxn = rmq_max(l, r), minn = rmq_min(l, r);
while (maxn - minn <= k && r < n) {
r++;
maxn = max(maxn, a[r]), minn = min(minn, a[r]);
}
if (maxn - minn > k) ans += n - r + 1;
l++;
}
cout << ans << endl;
}
return 0;
}


标签:stmax,King,minn,int,mn,多校,stmin,ST,区间
From: https://blog.51cto.com/u_12372287/5803552

相关文章

  • 6.CF431E Chemistry Experiment 权值线段树+二分
    6.CF431EChemistryExperiment权值线段树+二分给定数列,区间查询和,区间取模,单点修改。记录区间最大值,对于区间最大值小于模数的区间不予更新洛谷传送门:​​CF431EChemist......
  • Elasticsearch 集群健康值红色解决方法
    通过http://10.2.83.29:9100/查询集群状态为红色,说明部分主分片不可用head插件会以不同的颜色显示。绿色——最健康的状态,代表所有的主分片和副本分片都可用;黄色——所......
  • CF1163D Mysterious Code ACA+DP
    将两个串插入AC自动机,AC自动机带点权,S串带权值1,T串带权值-1,对树在构建时求树上点权前缀和,然后设表示到的第个字符,在ACA上的第个节点时的答案,那么就有转移方程:#include<bits......
  • 11.CF522D Closest Equals 线段树+离线询问
    11.CF522DClosestEquals线段树+离线询问给定序列,查询区间内距离最近的两个相等元素。离线查询,按右端点加入贡献计算答案即可洛谷传送门:​​CF522DClosestEquals-洛谷......
  • 安装完成openstack controller节点后出现net_mlx5: cannot load glue library: libibv
    报错信息: net_mlx5:cannotloadgluelibrary:libibverbs.so.1:cannotopensharedobjectfile:Nosuchfileordirectorynet_mlx5:cannotinitializePMDdue......
  • C/C++ 窗口取消置顶后被父窗口挡住,HWND_TOPMOST与HWND_NOTOPMOST踩坑记录
    遇到问题使用::SetWindowPos(hwnd,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);::SetWindowPos(hwnd,HWND_NOTOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);......
  • RedisTimeSeries实时时序数据库
    一、时序数据库是什么?时间序列数据库TimeSeriesDatabase(TSDB)时序数据是随时间不断产生的一系列数据,简单来说,就是带时间戳的数据。1.时序数据库相关概念度量Me......
  • 《STM32MP1 M4裸机HAL库开发指南》第六章 新建MDK工程
    第六章新建MDK工程​本教程所有例程都是在MDK下编写、编译和调试的,因此首先要学习的就是如何新建MDK工程,本章就来讲解一下最基本的MDK工程创建方法,工程创建成功以后用汇编......
  • hosts文件的作用
    我们在网络上访问网站,要首先通过DNS服务器把网络域名(www.xxx.com)解析成192.xxx.xxx.xxx的IP地址后【域名解析】,我们的计算机才能访问。要是对于每个域名请求我们都要等待......
  • delphi 将FastReport报表存入access数据库
    转载自:http://t.zoukankan.com/hnxxcxg-p-2940801.html以下代碼在D7+ACCESS+FastReport3.15版中測試通過.1.將FastReport存入數據庫中:在窗體的"Insert"按鈕的OnClick......