[nowcoder]最长区间

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

求最长连续严格递增序列

线段树模板题,码力弱的一匹调了半天。。

代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
#define M 100010
#define ls node*2
#define rs node*2+1
using namespace std;
int n,m;
int a[M],ml[M<<],mr[M<<],L[M<<],R[M<<],val[M<<];
void update(int node,int l,int r)
{
int ans=;
if(R[ls]<L[rs]) ans=mr[ls]+ml[rs];
val[node]=max(max(val[ls],val[rs]),ans);
L[node]=L[ls]; R[node]=R[rs];
int mid=(l+r)/;
ml[node]=ml[ls]; mr[node]=mr[rs];
if(ml[ls]==mid-l+&&R[ls]<L[rs]) ml[node]=ml[ls]+ml[rs];
if(mr[rs]==r-mid&&R[ls]<L[rs]) mr[node]=mr[rs]+mr[ls];
}
void build(int node,int l,int r)
{
if(l==r)
{
L[node]=R[node]=a[l];
ml[node]=mr[node]=val[node]=;
return;
}
int mid=(l+r)/;
build(ls,l,mid);
build(rs,mid+,r);
update(node,l,r);
}
void change(int node,int l,int r,int k,int x)
{
if(l==r)
{
L[node]=R[node]=x;
return;
}
int mid=(l+r)/;
if(k<=mid) change(ls,l,mid,k,x);
else change(rs,mid+,r,k,x);
update(node,l,r);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
build(,,n);
printf("%d\n",val[]);
for(int i=;i<=m;i++)
{
int x,y; scanf("%d%d",&x,&y);
change(,,n,x,y);
printf("%d\n",val[]);
}
return ;
}
上一篇:JSF和Struts的区别概述


下一篇:[ Nowcoder Contest 175 #B ] 区间