zoukankan      html  css  js  c++  java
  • bzoj 1012 基础线段树

    原题传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1012

    今儿一天状态不好,都没怎么刷题。。快下课了,刷道水题。。。。

    裸的线段树

    /**************************************************************
        Problem: 1012
        User: BLADEVIL
        Language: Pascal
        Result: Accepted
        Time:1688 ms
        Memory:12920 kb
    ****************************************************************/
     
    //By BLADEVIL
    type
        rec                     =record
            left, right, max    :longint;
        end;
         
    var
        query                   :array[0..200010] of longint;
        querys                  :array[0..200010] of char;
        m, d                    :longint;
        n                       :longint;
        t                       :array[0..1000010] of rec;
        tot                     :longint;   
        tt                      :longint;
         
    function max(a,b:longint):longint;
    begin
        if a>b then max:=a else max:=b;
    end;
         
    procedure build(x,l,r:longint);
    var
        mid                     :longint;
    begin
        t[x].left:=l; t[x].right:=r;
        if l=r then exit;
        mid:=(r+l) div 2;
        build(x*2,l,mid);
        build(x*2+1,mid+1,r);
    end;
         
    procedure init;
    var
        i                       :longint;
    begin
        readln(m,d);
        for i:=1 to m do
        begin
            read(querys[i]);
            readln(query[i]);
        end;
        for i:=1 to m do if querys[i]='A' then inc(n);
        build(1,1,n);
    end;
     
    procedure change(x,y,z:longint);
    var
        mid                     :longint;
    begin
        if (t[x].left=y) and (t[x].right=y) then
        begin
            t[x].max:=z;
            exit;
        end;
        with t[x] do mid:=(left+right) div 2;
        if y>mid then change(x*2+1,y,z) else change(x*2,y,z);
        t[x].max:=max(t[x*2].max,t[x*2+1].max);
    end;
     
    function ask(x,l,r:longint):longint;
    var
        mid                     :longint;
    begin
        if (t[x].left=l) and (t[x].right=r) then
        begin
            ask:=t[x].max;
            exit;
        end;
        with t[x] do mid:=(right+left) div 2;
        if l>mid then ask:=ask(x*2+1,l,r) else
        if r<=mid then ask:=ask(x*2,l,r) else
        ask:=max(ask(x*2,l,mid),ask(x*2+1,mid+1,r));
    end;
     
    procedure main;
    var
        i                       :longint;
     
    begin
        tot:=0;
        tt:=0;
        for i:=1 to m do
        begin
            if querys[i]='A' then
            begin
                inc(tot);
                change(1,tot,(query[i]+tt) mod d);
            end else
            begin
                tt:=ask(1,tot-query[i]+1,tot);
                writeln(tt);
            end;
        end;
    end;
     
    begin
        init;
        main;
    end.
  • 相关阅读:
    转 [ javascript面向对象技术
    制作双击可运行的jar
    使用eclipse和maven一步一步配置web项目
    [转]hibernate三种状态详解
    [转]hibernate缓存机制所有详解
    Miniprofiler在普通net项目中的使用
    sql server 中更改默认实例
    使用awstats分析iis站点的日志
    NaN 和 Infinity
    反射的结果中排除隐藏的成员
  • 原文地址:https://www.cnblogs.com/BLADEVIL/p/3436331.html
Copyright © 2011-2022 走看看