King of Range

题意:

给你n个数,有m个询问,每次询问一个x,问有多少个区间的最大值减最小值大于x

题解:

我一开始的想法
st表实现区间最大减最小,利用二分来找这个区间范围,复杂度O(nmlogn),正好被卡
一个签到题给做复杂了
我们这样想,我们定义左端i,然后去移动右端点pos,当出现pos大于k时,此时pos位置之后的肯定与l组成的区间也大于k,然后左端点移动(i++),右端点在pos继续走(pos不清零),为什么?
结合代码分析:
我们每次记录答案都是当区间差值刚好大于k时退出,也就是pos位置肯定是最大值或者最小值(会影响差值,不然也不可能跳出while循环)。记录完答案后左端点移动一位,此时区间是[i+1,pos],第l位没了,但是如果此时区间差值还是大于k,说明区间最值不是第i位,pos之后的右端点都是可以的,直接累加答案,如果小于等于k,继续右推右端点。
相当于这个差值区间是有这种性质,可以直接在前一个的基础上继承过来,不用重新找
这样复杂度应该是(2n)
总复杂度是(2mn)

for(int i = 1;i <= n;i++){while(query_max(i,pos)-query_min(i,pos)<=k&&pos+1<=n){pos++;}if(query_max(i,pos)-query_min(i,pos)>k){ans+=n-pos+1;}
}

官方题解是这样做的:
因为区间端点都是单调的,所以维护两个单调队列,其中一个递增序列,队首维护最小值,一个递减序列,队首维护最大值,每次弹出两个队列中队首考前的一个,直到极差<=k,这样就可以在均摊O(1)的时间内求Ri了
其实就相当于维护区间最大最小值,更新左端点,在左端点右侧的就要被弹出,这样一直维护
O(nm)

题解:

st+尺取

#include<bits/stdc++.h>using namespace std;
const int inf=0x3f3f3f3f;
typedef long long ll;
const int maxn = 1e5+50;int ffmax[maxn][20];
int ffmin[maxn][20];
int a[maxn];
int n,m,k;
double lg2[maxn];
int h;
int max2(int x,int y)
{if(x<y)return y;return x;
}
int min2(int x,int y)
{if(x<y)return x;return y;
}
void init(){memset(ffmax,0,sizeof(ffmax));memset(ffmin,0x3f,sizeof(ffmin));for(int i = 1;i <= n;i++){ffmax[i][0] = ffmin[i][0] = a[i];}for(int j = 1;j <=int(lg2[n]/lg2[2]);j++){       for(int i = 1;i+(1<<j)-1<= n;i++){            ffmax[i][j] = max2(ffmax[i][j-1],ffmax[i+(1<<(j-1))][j-1]);ffmin[i][j] = min2(ffmin[i][j-1],ffmin[i+(1<<(j-1))][j-1]);}}} int query_max(int l,int r){int s = int(lg2[r-l+1]/lg2[2]);//cout<<l<<" "<<l+(1<<s)-1<<" "<<r<<" "<<r-(1<<s)+1<<" "<<s<<endl;return max2(ffmax[l][s],ffmax[r-(1<<s)+1][s]);
}int query_min(int l,int r){int s = int(lg2[r-l+1]/lg2[2]);return min2(ffmin[l][s],ffmin[r-(1<<s)+1][s]);
}int main(){scanf("%d%d",&n,&m);for(int i=1;i<=100000;i++)lg2[i]=log(i); //cout<<lg2[2];h=int(lg2[n]/lg2[2]);for(int i = 1;i <= n;i++)  scanf("%d",&a[i]);init();//cout<<ffmax[3][2]<<endl;while(m--){scanf("%d",&k);ll ans = 0;int pos=0;for(int i = 1;i <= n;i++){while(query_max(i,pos)-query_min(i,pos)<=k&&pos+1<=n){pos++;}if(query_max(i,pos)-query_min(i,pos)>k){ans+=n-pos+1;}}printf("%lld\n",ans);} return 0;
}
/*
10 10
1 2 3 4 5 6 7 8 9 10
2
1 2 3 4 5*/

单调队列做法:

#include<bits/stdc++.h>
using namespace std;
long long a[100100];
long long qmax[100100];
long long qmin[100100];
int main(){int n,m,k;scanf("%d %d",&n,&m);for(int i=1;i<=n;++i){scanf("%d",&a[i]);}while(m--){scanf("%d",&k); long long ans=0;int l=1,h1=1,t1=0,h2=1,t2=0;for(int i=1;i<=n;i++){while(h1<=t1&&a[i]>=a[qmax[t1]]) t1--; while(h2<=t2&&a[i]<=a[qmin[t2]]) t2--;qmax[++t1]=i;qmin[++t2]=i;while(h1<=t1&&h2<=t2&&a[qmax[h1]]-a[qmin[h2]]>k){ans+=n-i+1;l++;if(qmax[h1]<l) h1++;if(qmin[h2]<l) h2++;}} cout<<ans<<endl;}
}

King of Range相关推荐

  1. 【2021牛客暑期多校训练营5】K King of Range(单调队列)

    K King of Range 题意: 给出一个长为n的序列,m次操作,每次操作求对于一个指定的k,原序列存在多少个连续子序列,满足该区间内最大值减最小值严格大于k. 思路: 令 Ri 为 l=i 时 ...

  2. 2021牛客暑期多校训练营5

    2021牛客暑期多校训练营5 题号 题目 知识点 A Away from College B Boxes 概率 C Cheating and Stealing D Double Strings 线性d ...

  3. 2021牛客暑期多校训练营5,签到题BDHJK

    题号 标题 已通过代码 通过率 团队的状态 A Away from College 点击查看 9/53 未通过 B Boxes 点击查看 637/2596 通过(数学期望,贪心结论) C Cheati ...

  4. PHP 数组基本概念

    初学PHP的时候对数组的一些基本总结.适用于小白的快速复习 <?php header('content-type:text/html;charset=utf-8'); //数组概念PHP其实并不 ...

  5. [转]python各模块的学习

    [-] 01 关于本书 02 代码约定 03 关于例子 04 如何联系我们 1 核心模块 11 介绍 111 内建函数和异常 112 操作系统接口模块 113 类型支持模块 114 正则表达式 115 ...

  6. 牛客多校第五场7月31日补题记录

    B Boxes 题意:有 nnn 个盒子,每个盒子中装有黑球白球概率均为 12\displaystyle \frac{1}{2}21​.打开第 iii 个盒子所需代价为 wiw_iwi​.现在有一个机 ...

  7. 【多校训练】2021牛客多校5

    [前言] 很久没有时间整理题解了,补题和打游戏的时间居多(doge) 这场其实主要F出题人数据有锅,花太多时间了(赛后重测是一血),然后后面G想歪了爆搜剪枝没过,I的回滚莫队队友前一天写了结果今天写不 ...

  8. SitePoint Podcast#180:David Lee King的Face2Face

    Episode 180 of The SitePoint Podcast is now available! This week Patrick O'Keefe (@ifroggy) intervie ...

  9. python求和1到100_Python3基础 sum,range 计算1到100的和

    镇场诗: ---大梦谁觉,水月中建博客.百千磨难,才知世事无常. ---今持佛语,技术无量愿学.愿尽所学,铸一良心博客. --------------------------------------- ...

最新文章

  1. Android SQLite调试
  2. 解决eclipse显示jar源代码中文乱码问题
  3. linux怎么退出vim编辑模式_Linux中的vim编辑器使用
  4. 2017你该买房,还是卖房?
  5. 表单提交时有的字段可以传递到后台有的不可以
  6. 工作302:scss目录编写
  7. 12种NumpyPandas高效技巧
  8. java图形接口_java基础七 [图形用户接口](阅读Head First Java记录)
  9. “CEPH浅析”系列之六——CEPH与OPENSTACK
  10. HTML+JS调用摄像头拍照并上传图片
  11. 计算机模板是什么意思,Office
  12. 【PC工具】更新win10关闭更新工具Windows Update Blocker
  13. Java+Servlet+Jsp(el, jstl)+MyBatis的CRUD练习小项目
  14. 解决无法看到eth0的简单情况
  15. The 2018 ACM-ICPC Asia Shenyang Regional Contest
  16. 序言页码(纯思维题)
  17. Jeecg-Boot简介
  18. html的时间格式转换为本地时间,将UTC日期字符串转为本地时间字符串,如@yyyy-MM-dd'T'HH:mm:ssZ转换为本地时间...
  19. Java笔记09——常用类
  20. 操作系统真象还原——12.初见MBR

热门文章

  1. 你一直憋着的那个屁,放出来时真的有人知道吗?我先告诉你憋着不放的屁会到哪去……...
  2. 麻省理工告诉我们男女配对的真相!
  3. 据说这篇总结覆盖了一般Python开发面试中可能会问到的大部分问题
  4. 12星座程序员写代码
  5. android方块密码输入框,Android仿微信/支付宝的方块密码输入框
  6. 江诗丹顿geneve系列_江诗丹顿的另一面
  7. c语言中把每个字母向前移1位,C语言:将字符串中的前导*号全部移到字符串的尾部。...
  8. bread是可数还是不可数_雅思官方语法教程之——这个名词到底可不可数?
  9. 计算机组成原理第04章在线测试,计算机组成原理第四章单元测试(二)(含答案).docx...
  10. javaweb应用开发与实践pdf_基于阿里云打造「云原生」Web应用——「懒猪行」Web应用开发实践...