B-最长区间

链接:https://www.nowcoder.com/acm/contest/158/B

来源:牛客网
 

                                                                                       B-最长区间

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

给你一个长度为 n 的序列 a ,求最长的连续的严格上升区间的长度。
同时会进行 m 次修改,给定 x , y ,表示将 ax 修改为 y ,每次修改之后都要求输出答案。

输入描述:

第一行 2 个数 n,m,表示序列长度,修改次数; 
接下来一行 n 个数表示  ;
接下来 m 行,每行 2 个数 x , y ,描述一次修改。

输出描述:

第一行 1 个数表示最初的答案;
接下来 m 行,第 i 行 1 个数表示第 i 次修改后的答案。

示例1

输入

复制

4 3
1 2 3 4
3 1
2 5
3 7

输出

复制

4
2
2
3

说明

序列变换如下:
1  2  3  4
1  2  1  4
1  5  1  4
1  5  7  4

备注:

n,m ≤ 100000,1 ≤ x ≤ n,1 ≤ ai,y ≤ 100

思路: 算是一个优雅的暴力把

代码:

#include<iostream>
#include<stdio.h>
#include<string.h>
#define N 120000
using namespace std;
int f[N],a[N],b[N],n,m;
int cal(){
    for(int i=100;i>=1;i--) if(b[i])return i;//这样直接就能找到最大的 
    return 1;
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    for(int i=1;i<=n;i++){
    	if(a[i]>a[i-1]) f[i]=f[i-1]+1;
    	else f[i]=1;
	}
    for(int i=1;i<=n;i++) b[f[i]]++;
    printf("%d\n",cal());
    for(int i=1;i<=m;i++){
        int x,y;
        scanf("%d%d",&x,&y);
        a[x]=y;
        for(int i=x;i<=min(n,x+100);i++){
            b[f[i]]--;//因为修改完之后不知道是否会影响子序列 
            if(a[i]>a[i-1]){
                f[i]=f[i-1]+1;
                b[f[i]]++;
            }
            else{
                f[i]=1;//赋值为1始终不会影响 
                b[f[i]]++;
            }
        }
        printf("%d\n",cal());
    }
}

猜你喜欢

转载自blog.csdn.net/DaDaguai001/article/details/82284004