[nowcoder]最长区间
Posted slrslr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[nowcoder]最长区间相关的知识,希望对你有一定的参考价值。
链接:https://www.nowcoder.com/acm/contest/158/B
求最长连续严格递增序列
线段树模板题,码力弱的一匹调了半天。。
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define M 100010 5 #define ls node*2 6 #define rs node*2+1 7 using namespace std; 8 int n,m; 9 int a[M],ml[M<<2],mr[M<<2],L[M<<2],R[M<<2],val[M<<2]; 10 void update(int node,int l,int r) 11 { 12 int ans=0; 13 if(R[ls]<L[rs]) ans=mr[ls]+ml[rs]; 14 val[node]=max(max(val[ls],val[rs]),ans); 15 L[node]=L[ls]; R[node]=R[rs]; 16 int mid=(l+r)/2; 17 ml[node]=ml[ls]; mr[node]=mr[rs]; 18 if(ml[ls]==mid-l+1&&R[ls]<L[rs]) ml[node]=ml[ls]+ml[rs]; 19 if(mr[rs]==r-mid&&R[ls]<L[rs]) mr[node]=mr[rs]+mr[ls]; 20 } 21 void build(int node,int l,int r) 22 { 23 if(l==r) 24 { 25 L[node]=R[node]=a[l]; 26 ml[node]=mr[node]=val[node]=1; 27 return; 28 } 29 int mid=(l+r)/2; 30 build(ls,l,mid); 31 build(rs,mid+1,r); 32 update(node,l,r); 33 } 34 void change(int node,int l,int r,int k,int x) 35 { 36 if(l==r) 37 { 38 L[node]=R[node]=x; 39 return; 40 } 41 int mid=(l+r)/2; 42 if(k<=mid) change(ls,l,mid,k,x); 43 else change(rs,mid+1,r,k,x); 44 update(node,l,r); 45 } 46 int main() 47 { 48 scanf("%d%d",&n,&m); 49 for(int i=1;i<=n;i++) scanf("%d",&a[i]); 50 build(1,1,n); 51 printf("%d ",val[1]); 52 for(int i=1;i<=m;i++) 53 { 54 int x,y; scanf("%d%d",&x,&y); 55 change(1,1,n,x,y); 56 printf("%d ",val[1]); 57 } 58 return 0; 59 }
以上是关于[nowcoder]最长区间的主要内容,如果未能解决你的问题,请参考以下文章
NowCoder--牛可乐发红包脱单ACM赛C_区区区间间间
牛客网NOIP赛前集训营-提高组(第四场)B 区间(单调优化)