码迷,mamicode.com
首页 > 其他好文 > 详细

[nowcoder]最长区间

时间:2018-08-25 11:39:05      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:coder   define   hang   nbsp   \n   com   blank   namespace   uil   

链接: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\n",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\n",val[1]);
57     }
58     return 0;
59 }

 

[nowcoder]最长区间

标签:coder   define   hang   nbsp   \n   com   blank   namespace   uil   

原文地址:https://www.cnblogs.com/Slrslr/p/9532899.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!