zoukankan      html  css  js  c++  java
  • BZOJ 1012 线段树||单调队列

    非常裸的线段树  ||

    单调队列:

    假设一个节点在队列中既没有时间优势(早点入队)也没有值优势(值更大),那么显然不管在如何的情况下都不会被选为最大值。

       既然它仅仅在末尾选。那么自然能够满足以上的条件。


    线段树

    #include "stdio.h"
    #include "string.h"
     
    struct node
    {
        int l,r,Max;
    }data[800010];
     
     
    int Max(int a,int b)
    {
        if (a<b) return b;
        else return a;
    }
     
    void build(int l,int r,int k)
    {
        int mid;
        data[k].l=l;
        data[k].r=r;
        data[k].Max=0;
        if (l==r) return ;
     
        mid=(l+r)/2;
     
        build(l,mid,k*2);
        build(mid+1,r,k*2+1);
    }
     
    void updata(int w,int k,int op)
    {
        int mid;
        if (data[k].l==w && data[k].r==w)
        {
            data[k].Max=op;
            return ;
        }
     
        mid=(data[k].l+data[k].r)/2;
     
        if (w<=mid) updata(w,k*2,op);
        else updata(w,k*2+1,op);
     
        data[k].Max=Max(data[k*2].Max,data[k*2+1].Max);
    }
     
    int query(int l,int r,int k)
    {
        int mid;
        if (data[k].l==l && data[k].r==r)
            return data[k].Max;
     
        mid=(data[k].l+data[k].r)/2;
     
        if (r<=mid) return query(l,r,k*2);
        else if (l>mid) return query(l,r,k*2+1);
        else return Max(query(l,mid,k*2),query(mid+1,r,k*2+1));
    }
     
    int main()
    {
        int m,d,t,x,now;
        char ch[2];
        while (scanf("%d%d",&m,&d)!=EOF)
        {
            build(1,m,1);
            t=0;
            now=0;
            while (m--)
            {
                scanf("%s%d",ch,&x);
                if (ch[0]=='A')
                {
                    x=(x+t)%d;
                    now++;
                    updata(now,1,x);
     
                }else
                {
                    t=query(now-x+1,now,1);
                    printf("%d
    ",t);
                }
            }
        }
        return 0;
    }
    单调队列:

    #include "stdio.h"
    #include "string.h"
    int f[200010];
    int main()
    {
        int t,now,m,d,x,i;
        char ch[2];
        while (scanf("%d%d",&m,&d)!=EOF)
        {
            t=0;
            now=0;
            while (m--)
            {
                scanf("%s%d",ch,&x);
                if (ch[0]=='A')
                {
                    f[++now]=(x+t)%d;
                    for (i=now-1;i>=1;i--)
                    if (f[i]<f[now]) f[i]=f[now];
                    else break;
                }
                else
                    printf("%d
    ",t=f[now-x+1]);
    
            }
        }
        return 0;
    }
    


  • 相关阅读:
    Android学习八---OpenCV JAVA API
    Android学习七---Hello OpenCV samples
    Android学习六---OpenCV for android samples
    android学习五---OpenCV for android环境搭建
    android学习四---Activity和Intent
    Servlet总结(Zpoor,你还说你不会Servlet?)
    Eclipse使用小技巧
    Java-List(冷静分析,稍加思索,识破)
    JDBC——setting useSSL=false, or set useSSL=true
    Java-foreach分析总结
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7253894.html
Copyright © 2011-2022 走看看