• hdu 3308 线段树


    题目大意:给n个数,两种操作1:U  a b   更新第a个为b (从0开始)
    2: Q    a ,b  查询 a,b之间LCIS(最长连续递增子序列)的长度。

    Sample Input
    1
    10 10
    7 7 3 3 5 9 9 8 1 8
    Q 6 6
    U 3 4
    Q 0 1
    Q 0 5
    Q 4 7
    Q 3 5
    Q 0 2
    Q 4 6
    U 6 10
    Q 0 9
    Sample Output

    1
    1
    4
    2
    3
    1
    2
    5

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <algorithm>
      4 #include <iostream>
      5 #define lson l,m,rt<<1
      6 #define rson m+1,r,rt<<1|1
      7 #define maxn  100005
      8 using namespace std;
      9 
     10 int mlen[maxn<<2],lmlen[maxn<<2],rmlen[maxn<<2];
     11 int num[maxn];
     12 
     13 void pushup(int rt,int l,int r)
     14 {
     15     lmlen[rt]=lmlen[rt<<1];
     16     rmlen[rt]=rmlen[rt<<1|1];
     17     mlen[rt]=max(mlen[rt<<1],mlen[rt<<1|1]);
     18     int mid=(l+r)>>1;
     19     int m=(r-l)+1;
     20     if(num[mid]<num[mid+1]) //左区间的右值小于右区间的左值可以合并
     21     {
     22         if(lmlen[rt]==m-(m>>1)) lmlen[rt]+=lmlen[rt<<1|1];
     23         if(rmlen[rt]==(m>>1)) rmlen[rt]+=rmlen[rt<<1];
     24         mlen[rt]=max(mlen[rt],lmlen[rt<<1|1]+rmlen[rt<<1]);
     25     }
     26 }
     27 void build(int l,int r,int rt)
     28 {
     29     if(l==r)
     30     {
     31         mlen[rt]=lmlen[rt]=rmlen[rt]=1;
     32         return ;
     33     }
     34     int m=(l+r)>>1;
     35     build(lson);
     36     build(rson);
     37     pushup(rt,l,r);
     38 }
     39 void  update(int a,int l,int r,int rt)
     40 {
     41     if(l==r)
     42     {
     43         return;
     44     }
     45     int m=(l+r)>>1;
     46     if(a<=m) update(a,lson);
     47     else update(a,rson);
     48     pushup(rt,l,r);
     49 }
     50 
     51 int query(int L,int R,int l,int r,int rt)
     52 {
     53     //printf("%d %d %d %d %d
    ",L,R,l,r,rt);
     54     if(L<=l&&r<=R)
     55     {
     56         return mlen[rt];
     57     }
     58     int m=(l+r)>>1;
     59     if(R<=m) return query(L,R,lson); //与一般不同,不能是子集,只能全部属于才能直接查询子区间 返回子区间的mlen
     60     if(L>m) return query(L,R,rson);  //否则是确认儿子区间是否能合并,并在三者之间取最大值
     61 
     62     int ta,tb;
     63     ta=query(L,R,lson);
     64     tb=query(L,R,rson);
     65     int ans;
     66     ans=max(ta,tb);
     67     if(num[m]<num[m+1])  //同上
     68     {
     69         int temp;
     70         temp=min(rmlen[rt<<1],m-L+1)+min(lmlen[rt<<1|1],R-m);
     71         ans=max(temp,ans);
     72     }
     73     return ans;
     74 }
     75 
     76 int main()
     77 {
     78     int T,n,m;
     79     int i,j;
     80     char f[2];
     81     int a,b;
     82     #ifndef ONLINE_JUDGE
     83     freopen("1.in","r",stdin);
     84     #endif
     85     scanf("%d",&T);
     86     for(i=0;i<T;i++)
     87     {
     88         scanf("%d %d",&n,&m);
     89         for(j=1;j<=n;j++)
     90            scanf("%d",&num[j]);
     91         build(1,n,1);
     92         while(m--)
     93         {
     94             scanf("%s",&f);
     95             if(f[0]=='U')
     96             {
     97                 scanf("%d %d",&a,&b);
     98                 a++;
     99                 num[a]=b;
    100                 update(a,1,n,1);
    101             }
    102             else
    103             {
    104                 scanf("%d %d",&a,&b);
    105                 a++,b++;
    106                 printf("%d
    ",query(a,b,1,n,1));
    107             }
    108         }
    109     }
    110     return 0;
    111 }
  • 相关阅读:
    java 微信公众号素材 新增其他类型永久素材
    @schedule
    idea 打包的jar运行报 “XXX中没有主清单属性”
    openjdk没有ssl支持的相关证书包,导致使用HTPPS调用第三方接口时候报错误 InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
    查询端口是否开通
    企业微信-之无法修改成员手机号
    PostgreSQL使用distinct关键字给单独的几列去重
    centos全屏幕退出:Alt+Enter
    github上OC 和swift框架精选
    github每日精选---iOS版
  • 原文地址:https://www.cnblogs.com/cnblogs321114287/p/4443456.html
Copyright © 2020-2023  润新知