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. ExtJS4 给同一个formpanel不同的url

    formpanel能够这样使用,api上的样例: var panel=Ext.create('Ext.form.Panel', { title: 'Simple Form', bodyPadding: ...

  2. 20170520 BADI增强学习

    一.要求:Tcode:FF_5 导入数据运行时,产生财务凭证之前修改某些字段值.Exmp:FEBRE-VWEZWBKPF-XBLNRFEBEP-CHECTBSEG-ZUONR there is a b ...

  3. 流量分析系统---redis

    1\启动redis 方法一: 修改了某些配置,具体步骤惨开下面的内容 [root@mini1 ~]# service redis stop/start 方法二: [root@mini1 bin]#cd ...

  4. 《Effective MySQL之SQL语句最优化》读书笔记——乱七八糟系列(给自己看)

    该书区别于诸如<MySQL技术内幕——InnoDB存储引擎>等书的一大特色是该书主要讲的是MySQL数据库中的索引技术,并分别讲了InnoDB.MyISAM.Memory三个存储引擎.其中 ...

  5. Nginx负载均衡案例

    nginx负载均衡配置,windows版本和linux版本的nginx除了启动方式其他基本无差异. 1.Niginx安装 参考:https://www.cnblogs.com/zwcry/p/9454 ...

  6. Delphi中ComPort通信中的数据处理

    源: Delphi中ComPort通信中的数据处理

  7. R基本画图

    参考内容:闻博,R语言的绘图功能及应用案例  https://wenku.baidu.com/view/80f22fa50029bd64783e2c22.html R画图是以函数操作为基本的画图模式. ...

  8. pom.xml里使用了一系列的版本的框架,配置一个版本属性,让使用版本的都引用这个属性

    在pom.xml定义properties标签 <properties> <project.build.sourceEncoding>UTF-8</project.buil ...

  9. Could not fetch URL https://pypi.org/simple/pip/: There was a problem confir

    这个问题其实是无意中解决的:因为在网上找不到解决办法,是我在yum -y installl wget后,自动就好了,安装wget的时候,可能更新了openssl的缘故吧.

  10. firefox和chrome实现页面打印自动分页

    在Firefox和chrome中直接调用打印功能的js方法是 window.print(); 但是如果页面很长,那么就需要分页,这时只需要在页面中添加css属性即可,如果想自动分页,则如下所示 < ...