Codeforces 601B. Lipshitz Sequence(单调栈)
Codeforces 601B. Lipshitz Sequence
题意: ,q个询问,每次询问给出l,r,求a数组[l,r]中所有子区间的L值的和。
,q个询问,每次询问给出l,r,求a数组[l,r]中所有子区间的L值的和。
思路:首先要观察到,斜率最大值只会出现在相邻两点上,因此可以处理出d数组,d[i]=a[i]-a[i-1]。则问题转化为求d数组在指定区间内,所有子区间的最大值的和。枚举子区间的复杂度是平方级别,显然是不能接受的,所以可以用单调栈预处理出每个d[i]可以成为最大值的最大区间(形象地说,也就是d[i]为最大值的域可以延伸到左、右各多远),用l,r数组保存这个信息,这样面对每次询问,只需要O(n)遍历d数组指定区间,累加d[i]*“d[i]为最值的区间个数”(这个可以根据l[i],r[i]的信息O(1)算出),累加结果即为本次询问答案。总的复杂度为O(q*n)。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<cstring>
#include<cmath>
#include<functional>
#include<climits>
#include<string>
#define dd(x) cout<<#x<<" = "<<x<<" "
#define de(x) cout<<#x<<" = "<<x<<"\n"
#define Clear(x,y) memset(x,y,sizeof(x))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int,int> P;
typedef vector<int> V;
typedef map<int,int> M;
typedef set<int> S;
typedef queue<int> Q;
typedef priority_queue<int> BQ;
typedef priority_queue<int,vector<int>,greater<int> > SQ;
const int maxn=1e5+10,mod=1e9+7,INF=0x3f3f3f3f;
int a[maxn],d[maxn],l[maxn],r[maxn],stack[maxn],top;
void init(int n)
{
	for (int i=2;i<=n;++i)
	{
		while (top>0&&d[stack[top]]<=d[i])
			r[stack[top--]]=i-1;
		l[i]=stack[top]+1;
		stack[++top]=i;
	}
	while (top>0)
		r[stack[top--]]=n;
}
int main()
{
	int n,q;
	scanf("%d%d",&n,&q);
	for (int i=1;i<=n;++i)
	{
		scanf("%d",&a[i]);
		d[i]=abs(a[i]-a[i-1]);
	}
	init(n);
	while (q--)
	{
		int L,R;
		scanf("%d%d",&L,&R);
		ll ans=0;
		for (int i=L+1;i<=R;++i)
		{
			int _l=max(l[i]-1,L),_r=min(r[i],R);
			ans+=ll(d[i])*(i-_l)*(_r-i+1);
		}
		printf("%lld\n",ans);
	}
	return 0;
}
Codeforces 601B. Lipshitz Sequence(单调栈)的更多相关文章
- Codeforces Round #333 (Div. 1)--B. Lipshitz Sequence 单调栈
		题意:n个点, 坐标已知,其中横坐标为为1~n. 求区间[l, r] 的所有子区间内斜率最大值的和. 首先要知道,[l, r]区间内最大的斜率必然是相邻的两个点构成的. 然后问题就变成了求区间[l, ... 
- CodeForces 601B Lipshitz Sequence
		Lipshitz Sequence 题解: 可以通过观察得到,对于任意一个区间来说, 只有相邻的2个点的差值才会是区间的最大值. 具体观察方法,可以用数学分析, 我是通过画图得到的. 那么基于上面的观 ... 
- Codeforces 407E - k-d-sequence(单调栈+扫描线+线段树)
		Codeforces 题面传送门 & 洛谷题面传送门 深感自己线段树学得不扎实-- 首先特判掉 \(d=0\) 的情况,显然这种情况下满足条件的区间 \([l,r]\) 中的数必须相同,双针扫 ... 
- Imbalanced Array CodeForces - 817D (思维+单调栈)
		You are given an array a consisting of n elements. The imbalance value of some subsegment of this ar ... 
- Codeforces #123D:  后缀数组+单调栈
		D. String You are given a string s. Each pair of numbers l and r that fulfill the condition 1 ≤ ... 
- 【bzoj1345】[Baltic2007]序列问题Sequence  单调栈
		题目描述 对于一个给定的序列a1, …, an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai和ai+1用一个元素max(ai,ai+1)替代,这样得到一个比原来序列短的新序列.这一 ... 
- Codeforces - 1199D - Welfare State - 单调栈 / 线段树
		https://codeforc.es/contest/1199/problem/D 其实后来想了一下貌似是个线段树的傻逼题. 单调栈是这样思考的,每次单点修改打上一个最终修改的时间戳.每次全体修改就 ... 
- CodeForces 280B(枚举 + 单调栈应用)
		题目链接 思路如下 这题恶心的枚举任意区间的 最大值及次最大值 ,正常的操作是,是很难实现的,但偏偏有个 单调栈这个动西,能够完成这个任务,跟单调队列相似,有单调 递增.递减的栈,这一题我们需要维护的 ... 
- Stack Sorting CodeForces - 911E (思维+单调栈思想)
		Let's suppose you have an array a, a stack s (initially empty) and an array b (also initially empty) ... 
随机推荐
- DateTime.TryParse 日期时间字符串验证
			DateTime applicationDatetime = new DateTime(); bool applicationDate = DateTime.TryParse("2019-0 ... 
- 怎样指定当前cookie不能通过js脚本获取
			所谓" 不能通过js脚本获取 " 主要指的是: 使用document.cookie / XMLHttpRequest对象 / Request API 等无法获取到当前cookie. ... 
- JS基础_函数的简介
			<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ... 
- 使用 SQL的 for xml path来进行字符串拼接
			本篇主要讲怎么利用SQL的FOR XML PATH 参数来进行字符串拼接,FOR XML PATH的用法很简单,它会以xml文件的形式来返回数据. 我的讲解步骤: 1:构造初始数据 2:提出问题 3: ... 
- Linux更新程序脚本
			DATE=$(date +%Y%m%d_%H%M%S) cd /opt/anystreaming/transcoder/ mv dll/libmonitor_service.so "dll/ ... 
- TypeScript入门三:TypeScript函数类型
			TypeScript函数类型 TypeScript函数的参数 TypeScript函数的this与箭头函数 TypeScript函数重载 一.TypeScript函数类型 在上一篇博客中已经对声明Ty ... 
- JS-闭包练习
			首先,第一个输出,因为前置运算,i要先参与输出,然后再自增,所以输出为0 第二个输出,因为f1和f2是不同的函数,不共享i变量,所以输出也为0 第三个输出,因为是f1,共享i,所以i加了1,输出为1 ... 
- 6.移动端自动化测试-小知识 if __name__==’__main__:是什么意思?
			1 引言 在Python当中,如果代码写得规范一些,通常会写上一句“if __name__==’__main__:”作为程序的入口,但似乎没有这么一句代码,程序也能正常运行.这句代码多余吗?原理又在哪 ... 
- JAVA对ArrayList排序
			ava如何对ArrayList中对象按照该对象某属性排序 增加排序功能,打印时:输出学生对象的时候,需要先按照年龄排序,如果年龄相同,则按照姓名排序,如果姓名也相同,则按照学号排序. Code hig ... 
- 基于SAML2.0的SAP云产品Identity Authentication过程介绍
			SAP官网的架构图 https://cloudplatform.sap.com/scenarios/usecases/authentication.html 上图介绍了用户访问SAP云平台时经历的Au ... 
