http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1272

1272 最大距离

题目来源: Codility
基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题
收藏
关注
给出一个长度为N的整数数组A,对于每一个数组元素,如果他后面存在大于等于该元素的数,则这两个数可以组成一对。每个元素和自己也可以组成一对。例如:{5, 3, 6, 3, 4, 2},可以组成11对,如下(数字为下标):
(0,0), (0, 2), (1, 1), (1, 2), (1, 3), (1, 4), (2, 2), (3, 3), (3, 4), (4, 4), (5, 5)。其中(1, 4)是距离最大的一对,距离为3。
Input
第1行:1个数N,表示数组的长度(2 <= N <= 50000)。
第2 - N + 1行:每行1个数,对应数组元素Ai(1 <= Ai <= 10^9)。
Output
输出最大距离。
Input示例
6
5
3
6
3
4
2
Output示例
3
一个很明显的做法是线段树维护区间最大值,然后二分查找最右的点。
我们还可以将这些数标记坐标之后按照值得大小升序排列,价值相同的坐标小的优先。
排序之后,每个数的最优点一定位于这个数的右侧,换句话说将求解的问题看做一个区间,我们固定右端点之后只要找到一个下标最小的左端点就好了,
遍历这些数据顺便维护一个最小的左端点,当前标记大于这个最小值就更新答案,小于的话说明这个数找不到与他匹配的,更新最小标记。
固定右端点找id最小的左端点,显然我们不必要每次都重新找,只要从左至右循环顺便维护一下这个最小值就好了。
 //排序做法
#include<bits/stdc++.h>
using namespace std;
struct node
{
int val,id;
bool operator<(const node &tmp)const{
if(val!=tmp.val) return val<tmp.val;
return id<tmp.id;
}
}P[];
int main()
{
int N,i,j,k,maxd=;
scanf("%d",&N);
for(i=;i<=N;++i)
{
scanf("%d",&P[i].val);
P[i].id=i;
}sort(P+,P++N);
int mini=P[].id;
for(i=;i<=N;++i)
{
if(P[i].id<mini) mini=P[i].id;
else maxd=max(maxd,P[i].id-mini);
}
printf("%d\n",maxd);
return ;
} //ST做法
#include<bits/stdc++.h>
using namespace std;
struct SegTree
{
#define M ((L+R)>>1)
#define lc (id<<1)
#define rc (id<<1|1)
int maxv[<<],A[],tot;
void init(){memset(maxv,,sizeof(maxv));tot=;}
void build(int L,int R,int id)
{
if(L==R){scanf("%d",&maxv[id]);A[++tot]=maxv[id];return;}
build(L,M,lc);
build(M+,R,rc);
maxv[id]=max(maxv[lc],maxv[rc]);
}
int Find(int L,int R,int id,int v)
{
if(L==R) return L;
if(maxv[rc]>=v) return Find(M+,R,rc,v);
else return Find(L,M,lc,v);
}
}seg;
int main()
{
int N,i,j,k,maxd=;
scanf("%d",&N);
seg.init();
seg.build(,N,);
for(i=;i<=N;++i)
{
maxd=max(maxd,seg.Find(,N,,seg.A[i])-i);
}
printf("%d\n",maxd);
return ;
}

51nod 1272 思维/线段树的更多相关文章

  1. Buy Tickets POJ - 2828 思维+线段树

    Buy Tickets POJ - 2828 思维+线段树 题意 是说有n个人买票,但是呢这n个人都会去插队,问最后的队列是什么情况.插队的输入是两个数,第一个是前面有多少人,第二个是这个人的编号,最 ...

  2. 牛客练习赛53 E-老瞎眼pk小鲜肉(思维+线段树+离线)

    前言 听说是线段树离线查询?? 做题做着做着慢慢对离线操作有点感觉了,不过也还没参透,等再做些题目再来讨论离线.在线操作. 这题赛后看代码发现有人用的树状数组,$tql$.当然能用树状数组写的线段树也 ...

  3. MemSQL Start[c]UP 2.0 - Round 1 F - Permutation 思维+线段树维护hash值

    F - Permutation 思路:对于当前的值x, 只需要知道x + k, x - k这两个值是否出现在其左右两侧,又因为每个值只有一个, 所以可以转换成,x+k, x-k在到x所在位置的时候是否 ...

  4. duliu——思维+线段树

    题目 [题目描述]小 `D` 喜欢出毒瘤题毒人.当然,他的毒瘤更多体现在若干个难题组合在同一场比赛时.小 `D` 脑中有 $n$ 个毒瘤题 idea,第 $i$ 个的毒值为$d_i$.当第 $i$ 个 ...

  5. 51nod 1376【线段树维护区间最大值】

    引自:wonter巨巨的博客 定义 dp[i] := 以数字 i(不是下标 i)为结尾的最长上升长度 然后用线段树维护 dp[i]: 每个节点维护 2 个信息,一个是当前区间的最大上升长度,一个是最大 ...

  6. Codeforces 755D:PolandBall and Polygon(思维+线段树)

    http://codeforces.com/problemset/problem/755/D 题意:给出一个n正多边形,还有k,一开始从1出发,向第 1 + k 个点连一条边,然后以此类推,直到走完 ...

  7. codeforces 459 D. Pashmak and Parmida's problem(思维+线段树)

    题目链接:http://codeforces.com/contest/459/problem/D 题意:给出数组a,定义f(l,r,x)为a[]的下标l到r之间,等于x的元素数.i和j符合f(1,i, ...

  8. 51Nod 1272最大距离 (树状数组维护前缀最小值)

    题目链接 最大距离 其实主流解法应该是单调栈……我用了树状数组. #include <bits/stdc++.h> using namespace std; #define rep(i, ...

  9. p3792 由乃与大母神原型和偶像崇拜(思维+线段树)

    要求 1.修改x位置的值为y 2.查询区间l,r是否可以重排为值域上连续的一段 可以,很lxl 然后一开始思考合并区间,但是发现可以重排序,GG 然后想了特殊性质,比如求和,但是显然可以被叉 这时候我 ...

随机推荐

  1. 通过存储过程运行通过DBLINK的查询语句失败-单个语句成功--ORA-00604

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/q947817003/article/details/24419459 客户遇到个问题,描写叙述例如以 ...

  2. ABAP发邮件函数

    步骤: 一.检查输入参数, (1)未指定文件類別代碼,(2)未指定郵件主題, (3)未指定郵件內容, (4)未指定發送人郵件地址, (5)未指定接收人郵件地址, 二.调用发送功能, (1)创建发送请求 ...

  3. sql server2005版本中,len函数计算了字符串末尾的空格

    sql server2005版本中,len函数计算了字符串末尾的空格的长度,以下是测试脚本: print @@version declare @v varchar(max) set @v = 'hp, ...

  4. url的配置

    from django.conf.urls import patterns, url urlpatterns = patterns('common.views', url(r'^$', 'index' ...

  5. outlook 设置分类收邮件

    打开outlook,工具---->“规则和通知”.建相应的规则即可.

  6. KVM虚拟化安装配置

    一.KVM的基础配置及安装: 1.查看是CPU否支持虚拟化: [root@oldboy-node1 ~]# grep -E "(vmx|svm)" /proc/cpuinfo vm ...

  7. offsetHeight+scrollHeight+clientHeight

    ch 窗口可见区域高度 :ch = padding + height(height不是所有内容的高度,是样式定义的高度) oh border以内的内容高度: oh = border + padding ...

  8. Yii2 注册表单验证规则 手机注册时候使用短信验证码

    public function rules() { return [ ['username', 'filter', 'filter' => 'trim'], ['username', 'requ ...

  9. 更改计算机名称,影响TFS之前映射的工作区 使用。

    今天把自己电脑的计算机名称改了,打开vs2012的时候,就提示以下的错误: ---------------------------Microsoft Visual Studio------------ ...

  10. mysql利于cte进行分组统计并计算占比

    CTE定义:一个公共表表达式(common table expression)是一个命名的临时结果集,它在一条单独的语句中有效,可以在语句中被引用多次. CTE基本语法: WITH cte1 [(co ...