链接:https://www.nowcoder.com/acm/contest/158/B
来源:牛客网
题目描述
给你一个长度为 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
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<b;i++)
#define per(i,a,b) for(int i=b-1;i>=a;i--)
typedef long long LL;
//begin
inline void read(int &x){
x=0;
static int p;p=1;
static char c;c=getchar();
while(!isdigit(c)){if(c=='-')p=-1;c=getchar();}
while(isdigit(c)) {x=(x<<1)+(x<<3)+(c-48);c=getchar();}
x*=p;
}
inline void print(int x){
static int cnt;
static int a[20];
cnt=0;
do{
a[++cnt]=x%10;
x/=10;
}while(x);
for(int i=cnt;i>=1;i--)putchar(a[i]+'0');
puts("");
}
//end
const int N=1e5+10;
int arr[N],val[N];
int num[101];
int n,m;
void change(int x,int a,int b){
int L,R;
int index=x-1;
while(index>0&&val[index]){
index--;
}
L=index+1;
//if(num1)++num1;
index=x+1;
while(index<n&&val[index])
{
index++;
}
R=index-1;
//if(num2)++num2;
// printf("L%d R:%d\n",L,R);
int num1=x-L,num2=R-x;
if(a)
{
--num[num1+num2+1];
++num[num1];
++num[num2];
}
else
{
++num[num1+num2+1];
--num[num1];
--num[num2];
}
val[x]=b;
// printf("x:%d num1:%d num2:%d\n",x,num1,num2);
}
/*
这道题当时也是没有什么思路,不知道怎么来维护答案,每次修改最多会
影响到左右100个数,所以我们就是要判断这个区域里面的值
同时我们也得知道有谁覆盖了这个区域,因为我要修改了
这里都是直接统计长度,计算就好,思维性比较大
*/
int main(){
//scanf("%d %d",&n,&m);
read(n);read(m);
rep(i,1,n+1)read(arr[i]);//scanf("%d",&arr[i]);
int cnt=0;
rep(i,1,n+1){
val[i]=arr[i+1]>arr[i]?1:0;
if(val[i])cnt++;
else{
num[cnt]++;
cnt=0;
}
}
// rep(i,1,5)printf("i:%d %d\n",i,num[i]);
int ans=0;
per(i,1,101)if(num[i]){
ans=i;break;
}
print(ans+1);
//printf("%d\n",ans+1);
while(m--){
int x,y;
//scanf("%d %d",&x,&y);
read(x);read(y);
if(y!=arr[x])
{
if(x>1&&arr[x]<=arr[x-1]&&y>arr[x-1]){
change(x-1,0,1);
}
else if(x>1&&arr[x]>arr[x-1]&&y<=arr[x-1]){
change(x-1,1,0);
}
if(x<n&&arr[x]<arr[x+1]&&y>=arr[x+1]){
change(x,1,0);
}
else if(x<n&&arr[x]>=arr[x+1]&&y<arr[x+1]){
change(x,0,1);
}
}
arr[x]=y;
// rep(i,1,5)printf("**i:%d %d\n",i,num[i]);
ans=0;
per(i,1,100)if(num[i]){
ans=i;break;
}
print(ans+1);
// printf("%d\n",ans+1);
}
return 0;
}