• Luogu P1198 [JSOI2008]最大数 线段树


    P1198 [JSOI2008]最大数

    题目描述

    现在请求你维护一个数列,要求提供以下两种操作:

    1、 查询操作。

    语法:Q L

    功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值。

    限制:L不超过当前数列的长度。

    2、 插入操作。

    语法:A n

    功能:将n加上t,其中t是最近一次查询操作的答案(如果还未执行过查询操作,则t=0),并将所得结果对一个固定的常数D取模,将所得答案插入到数列的末尾。

    限制:n是整数(可能为负数)并且在长整范围内。

    注意:初始时数列是空的,没有一个数。

    输入输出格式

    输入格式:

    第一行两个整数,M和D,其中M表示操作的个数(M <= 200,000),D如上文中所述,满足(0<D<2,000,000,000)

    接下来的M行,每行一个字符串,描述一个具体的操作。语法如上文所述。

    输出格式:

    对于每一个查询操作,你应该按照顺序依次输出结果,每个结果占一行。

    输入输出样例

    输入样例#1:
    5 100
    A 96
    Q 1
    A 97
    Q 1
    Q 2
    
    输出样例#1:
    96
    93
    96
    

    说明

    [JSOI2008]

    思路

    线段树小试牛刀!qwq

    先建一颗空的线段树,然后每次把值插入,用num统计个数

    然后每次查询num-n+1到num这个区间的最大值输出就是啦

    代码

     1 program maxnumber;
     2 const
     3   inf='maxnumber.in';
     4   outf='maxnumber.out';
     5 type
     6   tree=^node;
     7   node=record
     8           lc,rc:tree;
     9           l,r,val:longint;
    10        end;
    11 
    12 var
    13   i,m,n,d,ctot,num,l:longint;
    14   ch:char;
    15   t:tree;
    16   s,e,a:array[1..200000] of longint;
    17 
    18 function max(aa,bb:longint):longint;
    19 begin
    20   if aa>bb then exit(aa)
    21     else exit(bb);
    22 end;
    23 
    24 function min(aa,bb:longint):longint;
    25 begin
    26   if aa>bb then exit(bb)
    27     else exit(aa);
    28 end;
    29 
    30 procedure add(apple:longint);
    31 begin
    32     inc(num);
    33     a[num]:=apple mod d;
    34 end;
    35 
    36 procedure add(var t:tree; seat:longint; data:longint);
    37 begin
    38     if t^.l=t^.r then begin
    39                         t^.val:=max(t^.val,data);
    40                         exit;
    41                       end;
    42     if seat<=t^.lc^.r then add(t^.lc,seat,data)
    43     else add(t^.rc,seat,data);
    44     t^.val:=max(t^.val,data);
    45 end;
    46 
    47 procedure build(var t:tree; l,r:longint);
    48 var
    49   mid:longint;
    50 begin
    51     new(t);
    52     t^.l:=l;    t^.r:=r;
    53     if l=r then begin
    54                   t^.val:=a[l];
    55                   exit;
    56                 end;
    57     mid:=(l+r) div 2;
    58     build(t^.lc,l,mid);
    59     build(t^.rc,mid+1,r);
    60     t^.val:=max(t^.lc^.val,t^.rc^.val);
    61 end;
    62 
    63 function query(var t:tree; l,r:longint):longint;
    64 var
    65   mm:longint;
    66 begin
    67    if (t^.l=t^.r) or ((t^.l>=l) and (t^.r<=r)) then exit(t^.val);
    68    mm:=-maxlongint;
    69    if l<=t^.lc^.r then mm:=query(t^.lc,l,min(t^.lc^.r,r));
    70    if r>=t^.rc^.l then mm:=max(mm,query(t^.rc,max(t^.rc^.l,l),r));
    71    exit(mm);
    72 end;
    73 
    74 begin
    75  // assign(input,inf);    assign(output,outf);
    76   reset(input);     rewrite(output);
    77 
    78   readln(m,d);
    79   build(t,1,m);
    80   l:=0;
    81   for i:= 1 to m do
    82    begin
    83      readln(ch,n);
    84      if ch='A' then begin num:=num+1;   add(t,num,(n+l) mod d);   end
    85        else begin
    86               l:=query(t,num-n+1,num);
    87               writeln(l);
    88             end;
    89    end;
    90 
    91   close(input);
    92   close(output);
    93 end.
  • 相关阅读:
    HDU 2276
    HDU 2254
    HDU 1536 & 1944
    HDU 1538
    HDU 2177
    HDU 2176
    HDU 1209
    HDU 1254
    c++ 11 default delete
    ssh免密登录
  • 原文地址:https://www.cnblogs.com/bobble/p/6596186.html
Copyright © 2020-2023  润新知