Sticks Problem
Sticks Problem poj-2452
题目大意:给你一串n个数的数列a,上面的数为a1到an。我们求最大的y-x,其中,y和x满足1.x<y 2.任意的x<i<y,都有ai>ax&&ai<ay。
注释:n<=50000,ai<=100000
想法:我们很容易就想到,松弛x。那么,对于任意的x,y都必须满足这样的条件,就是说y和x之间的所有数,都大于ax。那么,我们就可以处理出任意的x右边的第一个比ax小的数的下标为r[x]。这样,我们就可以显然第知道,y必定存在于x到r[x]之间。那么,什么样的y是最大的且满足题意的呢?不难想到,就是x到r[x]之间的最大值的下标,就是y。这样,我们思考怎样才能实现这个过程?首先,我们需要求出r[x],这是n*n的,我们想优化吧,用单调队列优化,时间复杂度O(nlogn)。然后,我们对于任意的x都有一个唯一的r[x]与之对应,我们想在这段区间内求出这段区间之内的最大值,用ST求RMQ下标即可。
最后,附上丑陋的代码... ...
#include <iostream>
#include <cstdio>
#define N 50100
using namespace std;
int r[N],f[N][],a[N],log[N];
int main()
{
int n;
for(int i=;i<=N;i++) log[i]=log[i>>]+;//我们可以直接处理ST中的log数组
while(~scanf("%d",&n))
{
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(int i=n+;i>=;i--)//单调队列优化,那个(n+1)是极其重要的!!
{
if(a[i]>a[i+]) r[i]=i+;
else
{
int t=r[i+];
while(a[i]<a[t]) t=r[t];
r[i]=t;
}
}
r[n+]=-;
// for(int i=2;i<=n;i++) log[i]=log[i>>1]+1;
for(int i=;i<=n+;i++)//预处理的初始化是下标
{
f[i][]=i;
}
for(int i=;(<<i)<=n+;i++)
{
for(int j=;j+(<<i)-<=n+;j++)
{
if(a[f[j][i-]]>a[f[j+(<<(i-))][i-]])//由于我们维护的是下标,所以就比较的麻烦。
f[j][i]=f[j][i-];//其实我开始写的是三目运算符,但是太长了,就写if了。
else f[j][i]=f[j+(<<(i-))][i-];
}
}
int maxn=-;
int len=;
int maxx;
for(int i=;i<=n;i++)
{
len=log[r[i]-i+];
if(a[f[i][len]]>a[f[r[i]-(<<len)+][len]]) maxx=f[i][len];
else maxx=f[r[i]-(<<len)+][len];//同样,我们在查询时需要注意,我们维护的是下标。
maxn=max(maxn,maxx-i);
}
if(maxn<=) printf("-1\n");//这里,我们说明:因为y>x,所以maxn==0的情况也是不满足题意的。
else printf("%d\n",maxn);
}
}
小结:RMQ是可以维护下标的,只是实现过程有些磨人....
1.我们需要明确注意,单调队列优化的时候,r[n+1]是坚决不能是0的??!
2.单调队列处理下标时,不可对a赋值...这种错误只有我会犯了吧。
3.RMQ中ST的思想的重要性远远大于其代码本身。
Sticks Problem的更多相关文章
- POJ 2452 Sticks Problem
RMQ+二分....枚举 i ,找比 i 小的第一个元素,再找之间的第一个最大元素..... Sticks Problem Time Limit: 6000MS ...
- POJ_2452 Sticks Problem 【ST表 + 二分】
一.题目 Sticks Problem 二.分析 对于$i$和$j$,并没有很好的方法能同时将他们两找到最优值,所以考虑固定左端点$i$. 固定左端点后,根据题意,$a[i]$是最小值,那么现在的问题 ...
- POJ-2452 Sticks Problem 二分+RMQ
题目链接: https://cn.vjudge.net/problem/POJ-2452 题目大意: 给出一个数组a,求最大的j-i满足 i<j && a[i] ... a[j] ...
- Day6 - I - Sticks Problem POJ - 2452
Xuanxuan has n sticks of different length. One day, she puts all her sticks in a line, represented b ...
- POJ 2452 Sticks Problem (暴力或者rmq+二分)
题意:给你一组数a[n],求满足a[i] < a[k] < a[j] (i <= k <= j)的最大的 j - i . 析:在比赛时,我是暴力做的,虽然错了好多次,后来说理解 ...
- 搜索 + 剪枝 --- POJ 1101 : Sticks
Sticks Problem's Link: http://poj.org/problem?id=1011 Mean: http://poj.org/problem?id=1011&lan ...
- Hdu1051 Wooden Sticks 2017-03-11 23:30 62人阅读 评论(0) 收藏
Wooden Sticks Problem Description There is a pile of n wooden sticks. The length and weight of each ...
- 容斥 + 组合数学 ---Codeforces Round #317 A. Lengthening Sticks
Lengthening Sticks Problem's Link: http://codeforces.com/contest/571/problem/A Mean: 给出a,b,c,l,要求a+x ...
- hdu 1145(Sticks) DFS剪枝
Sticks Problem Description George took sticks of the same length and cut them randomly until all par ...
随机推荐
- 使用ifstream和getline读取文件内容[c++]
转载:http://www.cnblogs.com/JCSU/articles/1190685.html 假设有一个叫 data.txt 的文件, 它包含以下内容: Fry: One Jillion ...
- Unhandled event loop exception Java heap space
1 错误描述 2 错误原因 3 解决办法
- Caused by: java.lang.ClassNotFoundException: org.jbpm.pvm.internal.processengine.SpringHelper
1.错误描述 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -help ...
- c语言 第二次实验报告
一·实验题目,设计思路,实现方法 11-7 找鞍点 一个矩阵元素的"鞍点"是指该位置上的元素值在该行上最大.在该列上最小. 本题要求编写程序,求一个给定的n阶方阵的鞍点. 利用双重 ...
- 芝麻HTTP: Python爬虫利器之Requests库的用法
前言 之前我们用了 urllib 库,这个作为入门的工具还是不错的,对了解一些爬虫的基本理念,掌握爬虫爬取的流程有所帮助.入门之后,我们就需要学习一些更加高级的内容和工具来方便我们的爬取.那么这一节来 ...
- 如何从Eclipse 迁移到Android Studio 且保持Eclipse项目结构
本文demo下载:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId=531 Android项目 Eclipse与A ...
- ssm整合快速入门程序(二)
下面我们配置serivce层到项目中 1.service包中创建ItemsService.java接口,和service.imp包中创建一个service实现类ItemsServiceImpl.jav ...
- POJ1743:Musical Theme
题目 vjudge Sol 先差分 然后求不可重叠最长重复子串 bits/stdc++.h会CE # include <bits/stdc++.h> # define IL inline ...
- [SCOI2010]传送带
在两个传送带上分别三分两个点计算 三分套三分 # include <bits/stdc++.h> # define IL inline # define RG register # def ...
- Nginx负载均衡——扩展功能(NGINX Plus)
本文主要是介绍了NGINX Plus的相关功能,横跨了NGINX Plus R5/R6/R7/R9等各个不同版本的更新. 什么是NGINX Plus? 顾名思义,就是Nginx的加强版或者扩展版.我们 ...