POJ 2452 Sticks Problem
RMQ+二分。。。。
枚举 i ,找比 i 小的第一个元素,再找之间的第一个最大元素。。。。。
Time Limit: 6000MS | Memory Limit: 65536K | |
Total Submissions: 9338 | Accepted: 2443 |
Description
Now given the length of S1, S2, S3, …Sn, you are required to find the maximum value j - i.
Input
Line 1: a single integer n (n <= 50000), indicating the number of sticks.
Line 2: n different positive integers (not larger than 100000), indicating the length of each stick in order.
Output
Sample Input
4
5 4 3 6
4
6 5 4 3
Sample Output
1
-1
Source
#include <iostream>
#include <cstdio>
#include <cstring> using namespace std; int dp_max[][],dp_min[][],a[],n; int _max(int l,int r)
{
if(a[l]>=a[r]) return l;
else return r;
} int _min(int l,int r)
{
if(a[l]<=a[r]) return l;
else return r;
} void Init()
{
for(int i=;i<=n;i++)
dp_max[i][]=dp_min[i][]=i;
for(int j=;(<<j)<=n;j++)
{
for(int i=;i+(<<j)-<=n;i++)
{
int m=i+(<<(j-));
dp_max[i][j]=_max(dp_max[i][j-],dp_max[m][j-]);
dp_min[i][j]=_min(dp_min[i][j-],dp_min[m][j-]);
}
}
} int rmq_min(int L,int R)
{
int k=;
while(L+(<<k)-<=R) k++; k--;
return _min(dp_min[L][k],dp_min[R-(<<k)+][k]);
} int rmq_max(int L,int R)
{
int k=;
while(L+(<<k)-<=R) k++; k--;
return _max(dp_max[L][k],dp_max[R-(<<k)+][k]);
} int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=;i<=n;i++)
scanf("%d",a+i);
Init();
int ans=,r,k;
for(int i=;i+ans<n;i++)
{
int low=i+,high=n,mid;
while(low<=high)
{
if(low==high) break;
mid=(low+high)>>;
if(a[i]<a[rmq_min(low,mid)])
low=mid+;
else
high=mid;
}
r=low;
k=rmq_max(i,r);
if(a[i]<a[k])
ans=max(ans,k-i);
}
if(ans==) printf("-1\n");
else printf("%d\n",ans);
}
return ;
}
POJ 2452 Sticks Problem的更多相关文章
- 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 ...
- POJ 1681---Painter's Problem(高斯消元)
POJ 1681---Painter's Problem(高斯消元) Description There is a square wall which is made of n*n small s ...
- DFS(剪枝) POJ 1011 Sticks
题目传送门 /* 题意:若干小木棍,是由多条相同长度的长木棍分割而成,问最小的原来长木棍的长度: DFS剪枝:剪枝搜索的好题!TLE好几次,终于剪枝完全! 剪枝主要在4和5:4 相同长度的木棍不再搜索 ...
- POJ 1011 - Sticks DFS+剪枝
POJ 1011 - Sticks 题意: 一把等长的木段被随机砍成 n 条小木条 已知他们各自的长度,问原来这些木段可能的最小长度是多少 分析: 1. 该长度必能被总长整除 ...
- Sticks Problem
Sticks Problem poj-2452 题目大意:给你一串n个数的数列a,上面的数为a1到an.我们求最大的y-x,其中,y和x满足1.x<y 2.任意的x<i<y,都有ai ...
- 搜索+剪枝——POJ 1011 Sticks
搜索+剪枝--POJ 1011 Sticks 博客分类: 算法 非常经典的搜索题目,第一次做还是暑假集训的时候,前天又把它翻了出来 本来是想找点手感的,不想在原先思路的基础上,竟把它做出来了而且还是0 ...
- POJ_2452 Sticks Problem 【ST表 + 二分】
一.题目 Sticks Problem 二.分析 对于$i$和$j$,并没有很好的方法能同时将他们两找到最优值,所以考虑固定左端点$i$. 固定左端点后,根据题意,$a[i]$是最小值,那么现在的问题 ...
- 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 ...
随机推荐
- Ninject.MVC 知识点记录
Ninject 是跟Unity 差不多的DI容器.Ninject 推荐零配置,快速使用.小中型项目,最适合. 通过nuget,安装Ninject.MVC.略.参考博客:Ninject依赖注入 ...
- AngularJs form.FormController、ngModel.NgModelController
form.FormController FormController跟踪所有他所控制的和嵌套表单以及他们的状态,就像有效/无效或者脏值/原始. 每个表单指令创建一个FormController实例. ...
- 【Alpha版本】 第九天 11.17
一.站立式会议照片: 二.项目燃尽图: 三.项目进展: 成 员 昨天完成任务 今天完成任务 明天要做任务 问题困难 心得体会 胡泽善 完成我要应聘的详情显示,解决头像不能显示的问题,完成了报名及取消操 ...
- python不同模式打开文件的完全列表
模式 描述 r 以只读方式打开文件.文件的指针将会放在文件的开头.这是默认模式. rb 以二进制格式打开一个文件用于只读.文件指针将会放在文件的开头.这是默认模式. r+ 打开一个文件用于读写.文件指 ...
- python 培训之 Python 数据类型
0. 变量 计算机某块内存的标签,存储数据的容器的标签,可被覆盖. a = "" a = "a1bcd" a=a+"ddd&quo ...
- Saltstack之SSH(十一)
Saltstack之SSH 安装 yum install -y salt-ssh 官方文档 https://docs.saltstack.com/en/latest/topics/ssh/index ...
- DNS(企业级)
构建DNS(企业级) 1.硬件选型 CPU:12C以上配置 内存:16G 网络:千兆 2.初始化系统配置 关闭 iptables service iptables stop chkconfig ipt ...
- edmx代码分析
http://www.cnblogs.com/FoundationSoft/archive/2011/01/08/1930479.html 本文分析Entity Framework从数据库自动生成的模 ...
- 【原】redux异步操作学习笔记
摘要: 发觉在学习react的生态链中,react+react-router+webpack+es6+fetch等等这些都基本搞懂的差不多了,可以应用到实战当中,唯独这个redux还不能,学习redu ...
- 一个C#解决方案中各文件夹存放了些什么
在VS2015中"生成"(Build)的过程: Source Code(.cs) -> Compile -> Object File(intermediate file ...