链接: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());
}
}