Codeforces Round #333 Lipshitz Sequence 优先队列
来源:互联网 发布:沪昆高铁偷工减料知乎 编辑:程序博客网 时间:2024/06/06 02:42
题目地址:http://codeforces.com/contest/602/problem/D
题意:给定n,q。n代表有n个点,横坐标是1到n。纵坐标由输入给定,之后有q(q<100)个问题求给定的区间[c,d]。求所有子串的斜率绝对值的最大值(子串中取两点)之和。
题解:很容易发现,斜率绝对值的最大值一定是由相邻的两个点提供,每一个相邻两个点的斜率肯定有其管辖的范围(少说是它本身)。则用优先队列找到相邻两个点的斜率的向左管辖范围和向右管辖范围。则这个斜率提供的值为 abs(斜率)*(向左的范围)*(向右的范围)。详见代码。
#include <cstdio>#include <algorithm>#include <cstring>#define N 100005#define INF 1e9typedef long long ll;using namespace std;int a[N],b[N];pair<int,int>q[N],tmp;int vl[N],vr[N];int n,m,startn,endn;int main(){ int i; // freopen("in.txt","r",stdin); scanf("%d%d",&n,&m); for(i=1;i<=n;i++) scanf("%d",&a[i]); for(i=1;i<n;i++) //最大的abs(斜率)一定出现在相邻的两个点// b[i]=abs(a[i+1]-a[i]); b[0]=b[n]=INF; startn=endn=0; tmp.first=b[0];tmp.second=0; q[endn++]=tmp; for(i=1;i<n;i++) { while(startn<endn&&q[endn-1].first<=b[i])endn--; vl[i]=q[endn-1].second; tmp.first=b[i];tmp.second=i; q[endn++]=tmp; } startn=endn=0; tmp.first=b[n];tmp.second=n; q[endn++]=tmp; for(i=n-1;i>=1;i--) { while(startn<endn&&q[endn-1].first<b[i])endn--;//注意这里是小于而不是小于等于,防止和之后的重复计算// vr[i]=q[endn-1].second; tmp.first=b[i];tmp.second=i; q[endn++]=tmp; } int c,d; while(m--) { scanf("%d%d",&c,&d); ll ans=0; for(i=c;i<d;i++) { ans+=(ll)((ll)(i-max(vl[i],c-1))*(min(vr[i],d+1)-i-1)*b[i]); } printf("%I64d\n",ans); } //查看这个斜率的管辖范围。向左可以管辖多远,向右可以管辖多远// return 0;}
0 0
- Codeforces Round #333 Lipshitz Sequence 优先队列
- Codeforces Round #333 D. Lipshitz Sequence (单调栈)
- Lipshitz Sequence Codeforces Round #333 (Div. 1) B(单调栈)
- Codeforces Round #333 (Div. 2) 602D. Lipshitz Sequence 单调栈
- Codeforces Round #333 (Div. 2) D. Lipshitz Sequence (单调栈)
- Codeforces Round #333 (Div. 2)-D Lipshitz Sequence(单调栈)
- CodeForces 601B Lipshitz Sequence (单调队列)
- codeforces 601B Lipshitz Sequence
- 【codeforces 602D】Lipshitz Sequence
- Codeforces 601B Lipshitz Sequence
- codeforces 602 D. Lipshitz Sequence
- Codeforces Beta Round #3 D. Least Cost Bracket Sequence 贪心 优先队列
- codeforces 602 D. Lipshitz Sequence (单调栈)
- Codeforces 601B Lipshitz Sequence(高效)
- Codeforces 620D Lipshitz Sequence RMQ+二分
- 【单调栈】Codeforces 601B Lipshitz Sequence
- 【Codeforces Round 333 (Div 2)D】【线段树 or ST-RMQ 初始化78msAC】Lipshitz Sequence 若干区间询问所有子区间的答案和
- Codeforces 602D Lipshitz Sequence【思维+斜率单调栈】
- 签到题
- 解决virtualbox只能安装32bit的问题
- hdu 5569(dp)
- Nim GameMy
- qml实现简单记事本程序
- Codeforces Round #333 Lipshitz Sequence 优先队列
- Java之Jacob调用COM接口DLL-----------------------------------dm。dll
- 跨浏览器的事件对象
- 真·为WordPress添加自机LaTeX支持(LaTeX for WordPress+MathJax)
- Linux僵尸进程
- hibernate学习笔记(一)hibernate应用背景(为什么要用hibernate)
- 数据结构之栈
- axis生成web服务
- 回溯法Square