zoukankan      html  css  js  c++  java
  • 【HDU】3308 LCIS

     1 #include<cstdio>
     2 #define MAXN 100010
     3 struct node
     4 {
     5     int left,right,val;
     6 };
     7 int a[MAXN];
     8 node tree[MAXN<<2];
     9 inline int MAX(int x,int y)
    10 {
    11     return x>y?x:y;
    12 }
    13 inline int MIN(int x,int y)
    14 {
    15     return x>y?y:x;
    16 }
    17 inline void PushUp(int mid,int L,int R,int rt)
    18 {
    19     tree[rt].left=tree[rt<<1].left;
    20     tree[rt].right=tree[rt<<1|1].right;
    21     tree[rt].val=MAX(tree[rt<<1].val,tree[rt<<1|1].val);
    22     if(a[mid]<a[mid+1])
    23     {
    24         if(tree[rt].left==mid-L+1)
    25             tree[rt].left+=tree[rt<<1|1].left;
    26         if(tree[rt].right==R-mid)
    27             tree[rt].right+=tree[rt<<1].right;
    28         tree[rt].val=MAX(tree[rt].val,tree[rt<<1].right+tree[rt<<1|1].left);
    29     }
    30 }
    31 void Build(int L,int R,int rt)
    32 {
    33     if(L==R)
    34     {
    35         scanf("%d",&a[L]);
    36         tree[rt].left=tree[rt].val=tree[rt].right=1;
    37     }
    38     else
    39     {
    40         int mid=(L+R)>>1;
    41         Build(L,mid,rt<<1);
    42         Build(mid+1,R,rt<<1|1);
    43         PushUp(mid,L,R,rt);
    44     }
    45 }
    46 void Update(int x,int val,int L,int R,int rt)
    47 {
    48     if(L==R)
    49         a[L]=val;
    50     else
    51     {
    52         int mid=(L+R)>>1;
    53         if(mid>=x)
    54             Update(x,val,L,mid,rt<<1);
    55         else
    56             Update(x,val,mid+1,R,rt<<1|1);
    57         PushUp(mid,L,R,rt);
    58     }
    59 }
    60 int Query(int x,int y,int L,int R,int rt)
    61 {
    62     if(x<=L&&R<=y)
    63         return tree[rt].val;
    64     int mid=(L+R)>>1,ans=0;
    65     if(mid>=x)
    66         ans=MAX(ans,Query(x,y,L,mid,rt<<1));
    67     if(y>mid)
    68         ans=MAX(ans,Query(x,y,mid+1,R,rt<<1|1));
    69     if(a[mid]<a[mid+1])
    70         ans=MAX(ans,MIN(mid-x+1,tree[rt<<1].right)+MIN(y-mid,tree[rt<<1|1].left));
    71     return ans;
    72 }
    73 int main()
    74 {
    75     char ch;
    76     int c,n,m,x,y;
    77     scanf("%d",&c);
    78     while(c--)
    79     {
    80         scanf("%d%d",&n,&m);
    81         Build(1,n,1);
    82         while(m--)
    83         {
    84             scanf(" %c%d%d",&ch,&x,&y);
    85             if(ch=='U')
    86                 Update(x+1,y,1,n,1);
    87             else
    88                 printf("%d\n",Query(x+1,y+1,1,n,1));
    89         }
    90     }
    91     return 0;
    92 }
    新博客:www.zhixiangli.com
  • 相关阅读:
    async
    subing用法
    vue中子组件调用父组件的方法
    Python—创建目录
    Python—访问限制
    Python—实例方法,实例数据(类属性,实例属性)
    Python—对象,类
    tail命令
    head命令
    pwd命令
  • 原文地址:https://www.cnblogs.com/DrunBee/p/2516633.html
Copyright © 2011-2022 走看看