zoukankan      html  css  js  c++  java
  • hdu3308--LCIS 最大连续递增序列长度

    这个是动态的,所以要用线段树维护。代码里有注释因为ls敲成lsum,rs敲成rsum查错查了好久。。

      1 #include <set>
      2 #include <map>
      3 #include <cmath>
      4 #include <ctime>
      5 #include <queue>
      6 #include <stack>
      7 #include <cctype>
      8 #include <cstdio>
      9 #include <string>
     10 #include <vector>
     11 #include <cstdlib>
     12 #include <cstring>
     13 #include <iostream>
     14 #include <algorithm>
     15 using namespace std;
     16 typedef unsigned long long ull;
     17 typedef long long ll;
     18 const int inf = 0x3f3f3f3f;
     19 const double eps = 1e-8;
     20 template <class T>
     21 inline bool scan_d(T &ret)
     22 {
     23     char c;
     24     int sgn;
     25     if(c=getchar(),c==EOF) return 0;
     26     while(c!='-'&&(c<'0'||c>'9'))
     27         c=getchar();
     28     sgn=(c=='-')?-1:1;
     29     ret=(c=='-')?0:(c-'0');
     30     while(c=getchar(),c>='0'&&c<='9')
     31         ret=ret*10+(c-'0');
     32     ret*=sgn;
     33     return 1;
     34 }
     35 
     36 const int maxn = 1e5+10;
     37 int ls[maxn<<2],rs[maxn<<2];       //ls为区间左值,rs为区间右值  比较时要用到。
     38 int lsum[maxn<<2],rsum[maxn<<2],sum[maxn<<2];  //lsum为区间左上升长度,rsum为区间右上升长度,sum为区间最大上升长度。
     39 
     40 void push_up(int l,int r,int pos)
     41 {
     42     ls[pos] = ls[pos<<1];
     43     rs[pos] = rs[pos<<1|1];
     44     lsum[pos] = lsum[pos<<1];
     45     rsum[pos] = rsum[pos<<1|1];
     46     sum[pos] = max(sum[pos<<1],sum[pos<<1|1]);
     47     int mid = (l + r) >> 1;
     48     if (ls[pos<<1|1] > rs[pos<<1])
     49     {
     50         sum[pos] = max(sum[pos],rsum[pos<<1] + lsum[pos<<1|1]);
     51         if (lsum[pos<<1] == mid - l + 1)               //左区间左上升长度已满
     52             lsum[pos] += lsum[pos<<1|1];
     53         if (rsum[pos<<1|1] == r - mid)                 //同理,
     54             rsum[pos] += rsum[pos<<1];
     55     }
     56 }
     57 
     58 void build (int l,int r,int pos)
     59 {
     60     if (l == r)
     61     {
     62         int tmp;
     63         scanf ("%d",&tmp);
     64         ls[pos] = tmp;
     65         rs[pos] = tmp;
     66         lsum[pos] = rsum[pos] = sum[pos] = 1;
     67         return;
     68     }
     69     int mid =(l + r) >> 1;
     70     build(l,mid,pos<<1);
     71     build(mid+1,r,pos<<1|1);
     72     push_up(l,r,pos);
     73 }
     74 
     75 void update(int l,int r,int pos,int x,int val)
     76 {
     77     if (l == r)
     78     {
     79         ls[pos] = rs[pos] = val;
     80         return;
     81     }
     82     int mid = (l + r) >> 1;
     83     if (x <= mid)
     84         update(l,mid,pos<<1,x,val);
     85     else
     86         update(mid+1,r,pos<<1|1,x,val);
     87     push_up(l,r,pos);
     88 }
     89 
     90 
     91 int query(int l,int r,int pos,int ua,int ub)
     92 {
     93     if (ua <= l && ub >= r)
     94     {
     95         return sum[pos];
     96     }
     97     int mid = (l + r) >> 1;
     98     int ans1 = 0,ans2 = 0,ans3 = 0;
     99     if (ua <= mid)
    100         ans1 = query(l,mid,pos<<1,ua,ub);
    101     if (ub > mid)
    102         ans2 = query(mid+1,r,pos<<1|1,ua,ub);
    103     if (ls[pos<<1|1] > rs[pos<<1])
    104         ans3 = min(lsum[pos<<1|1],ub-mid) + min(rsum[pos<<1],mid-ua+1);
    105     return max(ans1,max(ans2,ans3));
    106 }
    107 
    108 
    109 int main(void)
    110 {
    111     #ifndef ONLINE_JUDGE
    112     freopen("in.txt","r",stdin);
    113     #endif
    114     int t;
    115     cin>>t;
    116     while (t--)
    117     {
    118         int n,q;
    119         scanf ("%d%d",&n,&q);
    120         build(1,n,1);
    121         char op[10];
    122         int x,y;
    123         for (int i = 0; i < q; i++)
    124         {
    125             scanf ("%s%d%d",op,&x,&y);
    126             if (op[0] == 'Q')
    127                 printf("%d
    ",query(1,n,1,x+1,y+1));
    128             if (op[0] == 'U')
    129                 update(1,n,1,x+1,y);
    130         }
    131     }
    132     return 0;
    133 }
  • 相关阅读:
    Vue 获取URL链接后面的参数值
    Vue 跳转到指定页面,返回到上一页
    Vant 插件
    Vue 返回上一页,记住上一页的数据
    vue pc端支付宝支付
    Spring 中的事务
    数据库中锁与事务
    《产品方法论》 读书笔记
    设计模式之装饰者模式
    设计模式之单例模式
  • 原文地址:https://www.cnblogs.com/oneshot/p/3997565.html
Copyright © 2011-2022 走看看