玲珑学院OJ 1149-Buildings-(RMQ+二分)

题目链接:http://www.ifrog.cc/acm/problem/1149

大致题意:给你n个数,问你这n个数中有多少个子区间的最大值减最小值小于等于k

题目思路:首先预处理一波区间最大最小值,RMQ跑一发即可(具体见代码),之后二分查找当前符合条件的子区间有多少个即可。。。。听说单调队列更省时?

#include    
#include    
#include  
#include    
#include    
#include  
#include
#include    
#include    
#include    
using namespace std;    
typedef long long  ll;    
#define inf 1000000000    
#define  mod 1000000007   
#define  maxn  200005
#define  INF 9223372036854775807LL
#define  lowbit(x) (x&-x)    
#define  eps 1e-10  
int a[maxn],b[maxn],mx[maxn][25],mn[maxn][25],n,k;
void RMQ()
{
	int i,j;
	memset(mn,127,sizeof(mn));
	for(i=1;i<=n;i++)
		mx[i][0]=mn[i][0]=a[i];
	for(j=1;(1<



你可能感兴趣的:(RMQ)