hdu3530Subsequence rmq

//用rmq做,ma[i][j],以i为起点的2^j长度的数组中的最大值

//枚举所求最长子列的起点

//枚举这个最大长度为是在2^(j-1)和2^(j)z之间

//然后再在这个范围内找

#include<iostream>

#include<cstdio>

#include<cstring>

#include<cmath>

using namespace std;

const int maxn=100010;

int a[maxn],ma[maxn][25],mi[maxn][25];

int n,m,k;

void rmq()

{

for(int i=1;i<=n;i++)

ma[i][0]=mi[i][0]=a[i];

for(int j=1;j<=log((double)(n))/log(2.0);j++)

for(int i=1;i+(1<<j)-1<=n;i++)

{

ma[i][j]=max(ma[i][j-1],ma[i+(1<<(j-1))][j-1]);

mi[i][j]=min(mi[i][j-1],mi[i+(1<<(j-1))][j-1]);

}

}

int query(int a,int b)

{

int k=(int)(log((double)(b-a+1))/log(2.0));

return max(ma[a][k],ma[b-(1<<(k))+1][k])-min(mi[a][k],mi[b-(1<<(k))+1][k]);

}

int Maxlen(int st,int pos)

{

int j;

for(j=0;(pos+(1<<j))<=n;j++)

{

int tmp=query(st,pos+(1<<j));

if(tmp>k)

{

if(j==0)

return pos;

return Maxlen(st,pos+(1<<(j-1)));

}

}

if((pos+(1<<(j-1))==n))

return n;

else

return Maxlen(st,pos+(1<<(j-1)));

}

int main()

{

// freopen("in.txt","r",stdin);

while(scanf("%d%d%d",&n,&m,&k)!=EOF)

{

for(int i=1;i<=n;i++)

scanf("%d",&a[i]);

rmq();

if(query(1,n)<m)

{

printf("0\n");

continue;

}

int ans=0;

for(int i=1;i<=n;i++)

{

int tmp=Maxlen(i,i-1);

ans=max(ans,tmp-i+1);

if(tmp==n||((n-i+1)<=ans))

break;

}

printf("%d\n",ans);

}

return 0;

}

时间: 2024-10-23 00:32:59

hdu3530Subsequence rmq的相关文章

dutacm.club 1094: 等差区间(RMQ区间最大、最小值,区间GCD)

1094: 等差区间 Time Limit:5000/3000 MS (Java/Others)   Memory Limit:163840/131072 KB (Java/Others)Total Submissions:655   Accepted:54 [Submit][Status][Discuss] Description 已知一个长度为 n 的数组 a[1],a[2],-,a[n],我们进行 q 次询问,每次询问区间 a[l],a[l+1],-,a[r?1],a[r] ,数字从小到大

RMQ问题再临

RMQ问题再临 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 终于,小Hi和小Ho踏上了回国的旅程.在飞机上,望着采购来的特产——小Hi陷入了沉思:还记得在上上周他们去超市的时候,前前后后挑了那么多的东西,都幸运的没有任何其他人(售货员/其他顾客)来打搅他们的采购过程.但是如果发生了这样的事情,他们的采购又会变得如何呢? 于是小Hi便向小Ho提出了这个问题:假设整个货架上从左到右摆放了N种商品,并且依次标号为1到N,每次小Hi都给出一段区间[L, R],小Ho要做

[bzoj3489]A simple rmq problem

本题既不是rmq也不会simple(对我这种蒟蒻而言) 一开始只能想到树套树套树TAT然后看了看数据范围果断滚去膜拜题解. 然后才知道预先排序一下可以弄掉一个log.不过得写可持久化线段树套可持久化线段树.. 然后愉悦的开码了...感人的是竟然不用调...更感人的是交上去直接tle了. 然后从网上找了别人的代码(方法一样)发现同样的数据我要跑6s+..标称只要2s+.. 之后各种卡常还是慢了一倍TAT...最后自己写个max函数就和标程一样快了TAT这几天怎么总是出些奇怪的状况QAQ. 本来故事

CodeForces 514D R2D2 and Droid Army RMQ+二分

题目链接:点击打开链接 题意:给定n m k 下面是n*m的矩阵 最多可以操作k次,每次操作可以使任意一列上所有的数 -= 1,( 0还是0) 要求得到连续最多的行数(每行里的整数都为0),输出任意一个方案(在每一列上操作的次数) 思路: 把每列单独考虑 枚举每行,二分找这行往下最多能清空的行数, RMQ维护一列的最大值. import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWr

poj 3264 Balanced Lineup RMQ线段树实现

Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 36613   Accepted: 17141 Case Time Limit: 2000MS Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same order. One day Farmer Joh

湖南省第七届大学生计算机程序设计竞赛 RMQ with Shifts (线段树)

RMQ with Shifts 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述     In the traditional RMQ (Range Minimum Query) problem, we have a static array A. Then for each query (L, R) (L<=R), we report the minimum value among A[L], A[L+1], -, A[R]. Note that the indic

[POJ 3264]Balanced Lineup(ST算法求RMQ)

Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same order. One day Farmer John decides to organize a game of Ultimate Frisbee with some of the cows. To keep things simple, he will take a contiguous rang

HDU_6194 后缀数组+RMQ

好绝望的..想了五个多小时,最后还是没A...赛后看了下后缀数组瞬间就有了思路...不过因为太菜,想了将近两个小时才吧这个题干掉. 首先,应当认为,后缀数组的定义是,某字符串S的所有后缀按照字典序有小到大的顺序排列(使用下标表示后缀).因为具体过程没太看懂,但是参见刘汝佳蓝书<算法竞赛黑暗圣典>可以得到一个聪明的NLOGN的神器算法.不过这个不太重要. 之后还可以通过他在LCP问题中提到的RANK,height数组相关算法,处理出来height数组,之后其他的可以扔掉. <黑暗圣典>

RMQ问题 - ST表的简单应用

2017-08-26 22:25:57 writer:pprp 题意很简单,给你一串数字,问你给定区间中最大值减去给定区间中的最小值是多少? 用ST表即可实现 一开始无脑套模板,找了最大值,找了最小值,分别用两个函数实现,实际上十分冗余 所以TLE了 之后改成一个函数中同时处理最大值和最小值,就可以了 AC代码如下: /* @theme:poj 3264 @writer:pprp @declare:ST表(sparse table)稀疏表,用动态规划的思想来解决RMQ问题: @date:2017