[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_区区区间间间

CSDN|每日一练最长递增的区间长度

CSDN|每日一练最长递增的区间长度

牛客网NOIP赛前集训营-提高组(第四场)B 区间(单调优化)

牛客网NOIP赛前集训营-提高组(第四场)B 区间(单调优化)

nowcoder 211E - 位运算?位运算! - [二进制线段树][与或线段树]