CodeForces - 602B

题目链接:https://vjudge.net/problem/284704/origin

Approximating a Constant Range

When Xellos was doing a practice course in university, he once had to measure the intensity of an effect that slowly approached equilibrium. A good way to determine the equilibrium intensity would be choosing a sufficiently large number of consecutive data points that seems as constant as possible and taking their average. Of course, with the usual sizes of data, it‘s nothing challenging — but why not make a similar programming contest problem while we‘re at it?

You‘re given a sequence of n data points a1, ..., an. There aren‘t any big jumps between consecutive data points — for each 1 ≤ i < n, it‘s guaranteed that |ai + 1 - ai| ≤ 1.

A range [l, r] of data points is said to be almost constant if the difference between the largest and the smallest value in that range is at most 1. Formally, let M be the maximum and m the minimum value of ai for l ≤ i ≤ r; the range [l, r] is almost constant if M - m ≤ 1.

Find the length of the longest almost constant range.

Input

The first line of the input contains a single integer n (2 ≤ n ≤ 100 000) — the number of data points.

The second line contains n integers a1, a2, ..., an (1 ≤ ai ≤ 100 000).

Output

Print a single number — the maximum length of an almost constant range of the given sequence.

Examples

Input

51 2 3 3 2

Output

4

Input

115 4 5 5 6 7 8 8 8 7 6

Output

5

Note

In the first sample, the longest almost constant range is [2, 5]; its length (the number of data points in it) is 4.

In the second sample, there are three almost constant ranges of length 4: [1, 4], [6, 9] and [7, 10]; the only almost constant range of the maximum length 5 is [6, 10].

题目意思:就是给你一个数组,保证数组中前后两个元素的差<=1,要你找出连续的并且任意两个数相差不超过1的最长串的长度。

题目分析:可以有以下做法:

1.dp

2.优化扩展串的长度

3.rmq做法

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+50;
int a[maxn],dp[maxn];
int main()
{
        int n;
        scanf("%d",&n);
        int ans=0;
        for(  int i=1; i<=n; i++ )
        {
              int x;
              scanf( "%d",&x );
              if(  dp[x-1]>dp[x+1] ) ans=max(  ans,i-max(  dp[x-2],dp[x+1] )  );
              else ans=max(  ans, i-max(dp[x+2],dp[x-1] ) );
              dp[x]=i;
        }
        printf( "%d\n",ans );
        return 0;
}

DP

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
int n,cnt,ans,a[maxn];
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    ans=0;
    int l=1,r=2;
    int one=a[1],two=a[2];//两个元素前后的差<=1
    while(r<=n){
        while(a[r]==one||a[r]==two) r++;//固定两个元素l不变r往右拓展
        ans=max(ans,r-l);//确定长度
        one=a[r-1];two=a[r];//更新两个元素
        l=r-1;//l更新
        while(a[l]==one) l--;//l回溯
        l++;
    }
    cout<<ans<<endl;
    return 0;
} 

边更新边扩展

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
int n,cnt,ans,a[maxn],dp[maxn][20],fp[maxn][20];
void init_rmq(){
    for(int i=1;i<=n;i++)dp[i][0]=fp[i][0]=a[i];
    for(int i=1;(1<<i)<=n;i++){
        for(int j=1;j+(1<<i)-1<=n;j++){
            dp[j][i]=max(dp[j][i-1],dp[j+(1<<i-1)][i-1]);
            fp[j][i]=min(fp[j][i-1],fp[j+(1<<i-1)][i-1]);
        }
    }
}
int query_max(int l,int r){
    int k=log2(r-l+1);
    return max(dp[l][k],dp[r-(1<<k)+1][k]);
}
int query_min(int l,int r){
    int k=log2(r-l+1);
    return min(fp[l][k],fp[r-(1<<k)+1][k]);
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    ans=0;
    init_rmq();
    int j=1;
    for(int i=1;i<=n;i++)
    {
        while(query_max(j,i)-query_min(j,i)>1&&j<=i)
        {
            j++;
        }
        ans=max(ans,i-j+1);
    }
    cout<<ans<<endl;
    return 0;
} 

RMQ

原文地址:https://www.cnblogs.com/Mingusu/p/12001295.html

时间: 2024-07-28 18:20:24

CodeForces - 602B的相关文章

Codeforces 602B Approximating a Constant Range(想法题)

B. Approximating a Constant Range When Xellos was doing a practice course in university, he once had to measure the intensity of an effect that slowly approached equilibrium. A good way to determine the equilibrium intensity would be choosing a suffi

codeforces 602B Approximating a Constant Range

B. Approximating a Constant Range When Xellos was doing a practice course in university, he once had to measure the intensity of an effect that slowly approached equilibrium. A good way to determine the equilibrium intensity would be choosing a suffi

【codeforces 718E】E. Matvey&#39;s Birthday

题目大意&链接: http://codeforces.com/problemset/problem/718/E 给一个长为n(n<=100 000)的只包含‘a’~‘h’8个字符的字符串s.两个位置i,j(i!=j)存在一条边,当且仅当|i-j|==1或s[i]==s[j].求这个无向图的直径,以及直径数量. 题解:  命题1:任意位置之间距离不会大于15. 证明:对于任意两个位置i,j之间,其所经过每种字符不会超过2个(因为相同字符会连边),所以i,j经过节点至多为16,也就意味着边数至多

Codeforces 124A - The number of positions

题目链接:http://codeforces.com/problemset/problem/124/A Petr stands in line of n people, but he doesn't know exactly which position he occupies. He can say that there are no less than a people standing in front of him and no more than b people standing b

Codeforces 841D Leha and another game about graph - 差分

Leha plays a computer game, where is on each level is given a connected graph with n vertices and m edges. Graph can contain multiple edges, but can not contain self loops. Each vertex has an integer di, which can be equal to 0, 1 or  - 1. To pass th

Codeforces Round #286 (Div. 1) A. Mr. Kitayuta, the Treasure Hunter DP

链接: http://codeforces.com/problemset/problem/506/A 题意: 给出30000个岛,有n个宝石分布在上面,第一步到d位置,每次走的距离与上一步的差距不大于1,问走完一路最多捡到多少块宝石. 题解: 容易想到DP,dp[i][j]表示到达 i 处,现在步长为 j 时最多收集到的财富,转移也不难,cnt[i]表示 i 处的财富. dp[i+step-1] = max(dp[i+step-1],dp[i][j]+cnt[i+step+1]) dp[i+st

Codeforces 772A Voltage Keepsake - 二分答案

You have n devices that you want to use simultaneously. The i-th device uses ai units of power per second. This usage is continuous. That is, in λ seconds, the device will use λ·ai units of power. The i-th device currently has bi units of power store

Educational Codeforces Round 21 G. Anthem of Berland(dp+kmp)

题目链接:Educational Codeforces Round 21 G. Anthem of Berland 题意: 给你两个字符串,第一个字符串包含问号,问号可以变成任意字符串. 问你第一个字符串最多包含多少个第二个字符串. 题解: 考虑dp[i][j],表示当前考虑到第一个串的第i位,已经匹配到第二个字符串的第j位. 这样的话复杂度为26*n*m*O(fail). fail可以用kmp进行预处理,将26个字母全部处理出来,这样复杂度就变成了26*n*m. 状态转移看代码(就是一个kmp

Codeforces Round #408 (Div. 2) B

Description Zane the wizard is going to perform a magic show shuffling the cups. There are n cups, numbered from 1 to n, placed along the x-axis on a table that has m holes on it. More precisely, cup i is on the table at the position x?=?i. The probl