【codeforces 602D】Lipshitz Sequence
time limit per test1 second
memory limit per test256 megabytes
inputstandard input
outputstandard output
A function is called Lipschitz continuous if there is a real constant K such that the inequality |f(x) - f(y)| ≤ K·|x - y| holds for all . We’ll deal with a more… discrete version of this term.
For an array , we define it’s Lipschitz constant as follows:
if n < 2,
if n ≥ 2, over all 1 ≤ i < j ≤ n
In other words, is the smallest non-negative integer such that |h[i] - h[j]| ≤ L·|i - j| holds for all 1 ≤ i, j ≤ n.
You are given an array of size n and q queries of the form [l, r]. For each query, consider the subarray ; determine the sum of Lipschitz constants of all subarrays of .
Input
The first line of the input contains two space-separated integers n and q (2 ≤ n ≤ 100 000 and 1 ≤ q ≤ 100) — the number of elements in array and the number of queries respectively.
The second line contains n space-separated integers ().
The following q lines describe queries. The i-th of those lines contains two space-separated integers li and ri (1 ≤ li < ri ≤ n).
Output
Print the answers to all queries in the order in which they are given in the input. For the i-th query, print one line containing a single integer — the sum of Lipschitz constants of all subarrays of .
Examples
input
10 4
1 5 2 9 1 3 4 2 1 7
2 4
3 8
7 10
1 9
output
17
82
23
210
input
7 6
5 7 7 4 6 6 2
1 2
2 3
2 6
1 7
4 7
3 5
output
2
0
22
59
16
8
Note
In the first query of the first sample, the Lipschitz constants of subarrays of with length at least 2 are:
The answer to the query is their sum.
【题目链接】:http://codeforces.com/contest/602/problem/D
【题解】
题意:
给你n个数字;
然后给你q个区间
每个区间l,r
让你求出[l,r]这个区间里面的数字的所有子列的L(h)的值的和;
(L(h)是任意两个点的斜率的绝对值的最大值);
做法:
可以肯定让你求L..R这个子列的区间的L(h)值
L(h)值必然是在abs(a[i]-a[i-1])中取到(i∈【L..R-1】)
可以看下图;
假设斜率的最大值不在相邻的两点之间得到;
设中间还有一个k;
则如果ak大于ai,则ai,ak连起来肯定更优,肯定比ai,aj连起来的斜率大
如果ak小于ai的话,则是ak,aj连起来更优;
总之只有在i,j相邻的时候,斜率才可能取到最大;
这样的话,我们就先把L..R这个区间内的相邻的数的差的绝对值处理出来
变为bi数组
然后枚举第bi中的第i个数字为斜率的最大值
看看这第i个数字能够“管理”“统治”的区间范围;
然后这段区间里面只要包括这第i个数字,则最大值肯定是就是第i个数字;
设其左边有l[i]个数字,右边有r[i]个数字
则答案递增l[i]*r[i]*b[i];
(左边选取l[i]个数字中的一个作为左端点,右边选取r[i]中的一个数字作为右端点,两个点组合成一个包围第i个点的区间);
这种问题可以用单调队列来搞;(单调栈?)
但是要注意重复的问题,所以左边在判断的时候加等号
右边判断的时候不加等号;
这样就不会重复计数了;
(可以拿样例中的第二组询问来理解这个重复区间的问题);
【完整代码】
#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%I64d",&x)
typedef pair<int,int> pii;
typedef pair<LL,LL> pll;
const int MAXN = 1e5+10;
const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
int n,q,top;
LL l[MAXN],r[MAXN],b[MAXN],a[MAXN];
int s[MAXN];
int main()
{
//freopen("F:\\rush.txt","r",stdin);
rei(n);rei(q);
rep1(i,1,n)
rel(a[i]);
rep1(i,1,q)
{
LL L,R,len,ans = 0;
rel(L);rel(R);
len = R-L;
rep1(j,L,R-1)
b[j-L+1] = abs(a[j+1]-a[j]);
//j∈L..R-1
top=0;
for (LL j = 1;j <= len;j++)
{
while (top && b[j]>=b[s[top]]) top--;//加等号
if (top==0)
l[j] = 0;
else
l[j] = s[top];
//s[top]>b[j]
s[++top] = j;
}
top = 0;
for (LL j = len;j >=1 ;j--)
{
while (top && b[j]>b[s[top]]) top--;//不加等号
if (top==0)
r[j] = len+1;
else
r[j] = s[top];
//s[top]>b[j]
s[++top] = j;
}
for (LL j = 1;j <= len;j++)
ans+=(j-l[j])*(r[j]-j)*b[j];
cout << ans << endl;
}
return 0;
}
【codeforces 602D】Lipshitz Sequence的更多相关文章
- 【codeforces 466D】Increase Sequence
[题目链接]:http://codeforces.com/problemset/problem/466/D [题意] 给你n个数字; 让你选择若干个区间; 且这些区间[li,ri]; 左端点不能一样; ...
- 【codeforces 623E】 Transforming Sequence
http://codeforces.com/problemset/problem/623/E (题目链接) 题意 长度为${n}$的满足前缀按位或为单调递增的${k}$位序列.要求每个位置为${[1, ...
- 【CodeForces 622A】Infinite Sequence
题意 一个序列是, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5....这样排的,求第n个是什么数字. 分析 第n个位置属于1到k,求出k,然后n-i*(i-1)/ ...
- 【codeforces 415D】Mashmokh and ACM(普通dp)
[codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...
- 【47.40%】【codeforces 743B】Chloe and the sequence
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 【codeforces 438D】The Child and Sequence
[原题题面]传送门 [大致题意] 给定一个长度为n的非负整数序列a,你需要支持以下操作: 1:给定l,r,输出a[l]+a[l+1]+…+a[r]. 2:给定l,r,x,将a[l],a[l+1],…, ...
- 【66.47%】【codeforces 556B】Case of Fake Numbers
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 【35.29%】【codeforces 557C】Arthur and Table
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 【23.33%】【codeforces 557B】Pasha and Tea
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
随机推荐
- java8新增特性(二)----函数式接口(Functional)
上一篇博客介绍了java8新增的Lambda表达式,这一节介绍一下java8的函数式编程,两者之间有什么联系呢?请往下看~~~ Lambda表达式怎样在java类型中表示的呢? 语言设计者投入了大量的 ...
- Android .getRGB得到是负数,解决方案
情景:ava.awt.color 下面的getRGB怎么得出的是负数???本来想通过getRGB得到一个整数,在另外的一个部分在根据这个整数构件一个color,因为参数规定只能能传整数!!!color ...
- Redis的高级应用-安全性和主从复制
Redis的服务器命令和键值命令(String,Hash,List,Set,Zset)相对简单,只需查看文档即可. 文档地址: http://www.runoob.com/redis/redis-tu ...
- [置顶]
WebService学习总结(4)——第三方webService服务调用
互联网上面有很多的免费webService服务,我们可以调用这些免费的WebService服务,将一些其他网站的内容信息集成到我们的Web应用中显示,下面就以获取天气预报数据和查询国内手机号码归属地为 ...
- 洛谷 P1601 A+B Problem(高精)
P1601 A+B Problem(高精) 题目背景 无 题目描述 高精度加法,x相当于a+b problem,[b][color=red]不用考虑负数[/color][/b] 输入输出格式 输入格式 ...
- HDU 2577 How to Type (线性dp)
How to Type Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- HDU 5071 模拟
考察英语的题 - -# 按条件模拟,一遍即可了,每一个聊天对象有其价值U.数组模拟队列过程即可,若存在Top标记,则和Top标记的人聊天,否则和队列的第一个人聊天 mark记录队尾,top记录Top操 ...
- CSS笔记 - fgm练习 2-7 - 简易选项卡
练习地址 http://www.fgm.cc/learn/lesson2/07.html <style> body,ul,li{margin:0;padding:0;} body{font ...
- 【Codeforces Round #433 (Div. 2) B】Maxim Buys an Apartment
[链接]h在这里写链接 [题意] 你有n个位置,然后其中有k个地方是已经被人占据了的. 一个"好的位置"的定义是指,这个位置相邻的地方其中至少有一个被人占据了. k个被人占据的位置 ...
- docker安装及问题处理
1.在Ubuntu的命令行中输入 sudo apt-get install docker.io 2.如果切换到了root用户下 apt-get install docker.io 3.对于新安装的Ub ...