CodeForces 601B Lipshitz Sequence (单调队列)
来源:互联网 发布:语音广告合成软件 编辑:程序博客网 时间:2024/06/05 23:58
分析:很容易想到,区间斜率绝对值的最大值一定是所有相邻的斜率中的最大值。
然后把序列处理成后一个数减前一个数的绝对值。
由于
找左边第一个比该数大的值可以通过单调队列来搞定,预处理出所有的
附上代码:
#include <bits/stdc++.h>#define LL long long#define FOR(i,x,y) for(int i = x;i < y;++ i)#define IFOR(i,x,y) for(int i = x;i > y;-- i)using namespace std;typedef pair<int,int> pii;const int maxn = 100010;const int inf = 1<<30;int L[maxn],R[maxn];int q[maxn],head,a[maxn];pii dif[maxn];int n,m;void init(){ IFOR(i,n-1,0) a[i] = abs(a[i]-a[i-1]),dif[i] = make_pair(a[i],i); dif[0] = make_pair(inf,0); head = 0; q[head++] = 0; FOR(i,1,n){ while(a[i] >= dif[q[head-1]].first) -- head; L[i] = dif[q[head-1]].second; q[head++] = i; } dif[n] = make_pair(inf,n); head = 0; q[head++] = n; IFOR(i,n-1,0){ while(a[i] > dif[q[head-1]].first) -- head; R[i] = dif[q[head-1]].second; q[head++] = i; }}void work(){ FOR(i,0,m){ int l,r; scanf("%d%d",&l,&r); -- l; -- r; LL ans = 0; FOR(i,l+1,r+1){ LL llen = i - max(L[i],l),rlen = min(R[i],r+1) - i; ans += llen*rlen*a[i]; } printf("%I64d\n",ans); }}int main(){ //freopen("test.in","r",stdin); while(~scanf("%d%d",&n,&m)){ FOR(i,0,n) scanf("%d",&a[i]); init(); work(); } return 0;}
0 0
- CodeForces 601B Lipshitz Sequence (单调队列)
- 【单调栈】Codeforces 601B Lipshitz Sequence
- Codeforces 601B Lipshitz Sequence(高效)
- codeforces 601B Lipshitz Sequence
- Codeforces 601B Lipshitz Sequence
- Code Forces 601 B. Lipshitz Sequence(单调栈)
- Lipshitz Sequence Codeforces Round #333 (Div. 1) B(单调栈)
- Codeforces Round #333 D. Lipshitz Sequence (单调栈)
- codeforces 602 D. Lipshitz Sequence (单调栈)
- Codeforces Round #333 Lipshitz Sequence 优先队列
- Codeforces Round #333 (Div. 2) D. Lipshitz Sequence (单调栈)
- Codeforces Round #333 (Div. 2)-D Lipshitz Sequence(单调栈)
- Codeforces 602D Lipshitz Sequence【思维+斜率单调栈】
- CF 601B(Lipshitz Sequence-贪心)
- cf div2 #333 D. Lipshitz Sequence (单调栈)
- 【codeforces 602D】Lipshitz Sequence
- codeforces 602 D. Lipshitz Sequence
- Codeforces Round #333 (Div. 2) 602D. Lipshitz Sequence 单调栈
- Struts2中的ModelDriven机制及其运用
- 【LeetCode】292 Nim Games (java实现)
- 方法的参数传递机制
- 05_Java 网络编程
- 经典冒泡排序法
- CodeForces 601B Lipshitz Sequence (单调队列)
- 找第二大的数
- ubuntu kylin 15.10 防火墙 和 mysql不能远程访问的解决方法
- C/C++ 基础
- 第6章5节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-事件
- ISSC、红果蓝牙设备日志分析
- 安装Python 包自动安装工具 easy_install 和pip
- elasticsearch2.0学习之路(一)es在linux中的安装和集群配置
- 第6章6节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令队列