标签:coder define hang nbsp \n com blank namespace uil
求最长连续严格递增序列
线段树模板题,码力弱的一匹调了半天。。
代码:
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 }
标签:coder define hang nbsp \n com blank namespace uil
原文地址:https://www.cnblogs.com/Slrslr/p/9532899.html