• uestc Another LCIS


    Another LCIS

    Time Limit: 1000 ms Memory Limit: 65536 kB Solved: 193 Tried: 2428 

    Description

    For a sequence S1,S2,...,SN, and a pair of integers (i, j), if 1 <= i <= j <= N and Si < Si+1 < Si+2 <...< Sj-1 < Sj, then the sequence Si,Si+1,...,Sj is a CIS (Continuous Increasing Subsequence). The longest CIS of a sequence is called the LCIS (Longest Continuous Increasing Subsequence).In this problem, we will give you a sequence first, and then some “add” operations and some “query” operations. An add operation adds a value to each member in a specified interval. For a query operation, you should output the length of the LCIS of a specified interval.

    Input

    The first line of the input is an integer T, which stands for the number of test cases you need to solve.Every test case begins with two integers N, Q, where N is the size of the sequence, and Q is the number of queries. S1,S2,...,SN are specified on the next line, and then Q queries follow. Every query begins with a character ‘a’ or ‘q’. ‘a’ is followed by three integers L, R, V, meaning that add V to members in the interval [L, R] (including L, R), and ‘q’ is followed by two integers L, R, meaning that you should output the length of the LCIS of interval [L, R].

    T <= 10;

    1 <= N, Q <= 100000;

    1 <= L <= R <= N;

    -10000 <= S1,S2,...,SN, V <= 10000.

    Output

    For every test case, you should output "Case #k:" on a single line first, where k indicates the case number and starts at 1. Then for every ‘q’ query, output the answer on a single line. See sample for more details.

    Sample Input

    1

    5 6

    0 1 2 3 4

    q 1 4

    a 1 2 -10

    a 1 1 -6

    a 5 5 -4

    q 2 3

    q 4 4

    Sample Output

    Case #1:421

    Source

    The 9th UESTC Programming Contest Preliminary

      1 #include<stdio.h>
      2 #define HH 1
      3 struct st
      4 {
      5     int l,r;
      6     int lnum,rnum;
      7     int max;
      8     int lmax,rmax;
      9     int color;
     10     int num;
     11 } f[100002*4];
     12 int date[100002];
     13 int max(int x,int y)
     14 {
     15     if(x>y)
     16         return x;
     17     else return y;
     18 }
     19 int min(int x,int y)
     20 {
     21     if(x<y)
     22         return x;
     23     else return y;
     24 }
     25 int Max(int x,int y,int z,int t,int b)
     26 {
     27     return max(max(max(x,y),z),max(t,b));
     28 }
     29 void up(struct st *fa,struct st *lll,struct st *rrr)
     30 {
     31     fa->lnum=lll->lnum;
     32     fa->rnum=rrr->rnum;
     33     if(lll->rnum>=rrr->lnum)
     34     {
     35         fa->lmax=lll->lmax;
     36         fa->rmax=rrr->rmax;
     37         fa->max=max(lll->max,rrr->max);
     38     }
     39     else if(lll->rnum<rrr->lnum)
     40     {
     41         fa->lmax=(lll->lmax==(lll->r-lll->l+1))? lll->lmax+rrr->lmax:lll->lmax;
     42         fa->rmax=(rrr->rmax==(rrr->r-rrr->l+1))? rrr->rmax+lll->rmax:rrr->rmax;
     43         fa->max=Max(fa->lmax,fa->rmax,lll->max,rrr->max,lll->rmax+rrr->lmax);
     44     }
     45 }
     46 void down(int n)
     47 {
     48     if(f[n*2].color==HH)
     49         f[n*2].num+=f[n].num;
     50     else f[n*2].num=f[n].num;
     51     f[n*2].lnum+=f[n].num;
     52     f[n*2].rnum+=f[n].num;
     53 
     54     if(f[n*2+1].color==HH)
     55         f[n*2+1].num+=f[n].num;
     56     else f[n*2+1].num=f[n].num;
     57     f[n*2+1].lnum+=f[n].num;
     58     f[n*2+1].rnum+=f[n].num;
     59 
     60     f[n*2].color=HH;
    
     61     f[n*2+1].color=HH;
     62 
     63     f[n].color=0;
     64     f[n].num=0;
     65 }
     66 void build(int l,int r,int n)
     67 {
     68     int mid=(l+r)/2;
     69     f[n].l=l;
     70     f[n].r=r;
     71     f[n].color=0;
     72     f[n].num=0;
     73     if(l==r)
     74     {
     75         f[n].lmax=1;
     76         f[n].rmax=1;
     77         f[n].max=1;
     78         f[n].lnum=date[l];
     79         f[n].rnum=date[l];
     80         return ;
     81     }
     82     build(l,mid,n*2);
     83     build(mid+1,r,n*2+1);
     84     up(&f[n],&f[n*2],&f[n*2+1]);
     85 }
     86 void update(int l,int r,int num,int n)
     87 {
     88     int mid=(f[n].l+f[n].r)/2;
     89     if(f[n].l==l&&f[n].r==r)
     90     {
     91         if(f[n].color==HH)
     92             f[n].num=f[n].num+num;
     93         else f[n].num=num;
     94         f[n].color=HH;
     95         f[n].lnum+=num;
     96         f[n].rnum+=num;
     97         return ;
     98     }
     99     if(f[n].color==HH)
    100         down(n);
    101     if(mid>=r)
    102         update(l,r,num,n*2);
    103     else if(mid<l)
    104         update(l,r,num,n*2+1);
    105     else
    106     {
    107         update(l,mid,num,n*2);
    108         update(mid+1,r,num,n*2+1);
    109     }
    110     up(&f[n],&f[n*2],&f[n*2+1]);
    111 }
    112 int query(int l,int r,int n)
    113 {
    114     int mid=(f[n].l+f[n].r)/2;
    115     int a=0,b=0,ans=0;
    116     if(f[n].l==l&&f[n].r==r)
    117     {
    118         return f[n].max;
    119     }
    120     if(f[n].color==HH)
    121         down(n);
    122     if(mid>=r)
    123         return query(l,r,n*2);
    124     else if(mid<l)
    125         return query(l,r,n*2+1);
    126     a=query(l,mid,n*2);
    127     b=query(mid+1,r,n*2+1);
    128     if(f[n*2].rnum>=f[n*2+1].lnum)
    129         ans=max(a,b);
    130     else if(f[n*2].rnum<f[n*2+1].lnum)
    131     {
    132         ans=max(max(a,b),min(mid-l+1,f[n*2].rmax)+min(r-mid,f[n*2+1].lmax));
    133     }
    134     return ans;
    135 }
    136 int main()
    137 {
    138     int i,j,k,n,m,l,r,num,t;
    139     char c[5];
    140     while(scanf("%d",&t)>0)
    141     {
    142         for(i=1; i<=t; i++)
    143         {
    144             scanf("%d%d",&n,&m);
    145             for(j=1; j<=n; j++)
    146                 scanf("%d",&date[j]);
    147             build(1,n,1);
    148             printf("Case #%d:
    ",i);
    149             getchar();
    150             for(j=1; j<=m; j++)
    151             {
    152                 scanf("%s",c);
    153                 if(c[0]=='q')
    154                 {
    155                     scanf("%d%d",&l,&r);
    156                     k=query(l,r,1);
    157                     printf("%d
    ",k);
    158                 }
    159                 else if(c[0]=='a')
    160                 {
    161                     scanf("%d%d%d",&l,&r,&num);
    162                     update(l,r,num,1);
    163                 }
    164             }
    165         }
    166     }
    167     return 0;
    168 }
  • 相关阅读:
    设计模式~门面模式
    设计模式~享元模式
    设计模式~代理模式
    Java IO流:(六)节点流(文件流)之 FileWriter
    Java IO流:(五)节点流(文件流)之 FileReader
    Java IO流:(四)节点流(文件流)
    Java IO流:(三)IO流四大基类
    Java IO流:(二)IO流原理及流的分类
    Java IO流:(一)File 文件类
    每周总结
  • 原文地址:https://www.cnblogs.com/tom987690183/p/3362621.html
Copyright © 2020-2023  润新知