zoukankan      html  css  js  c++  java
  • codevs3304水果姐逛水果街

    /*
    线段树开到*4 *4 *4 *4 !
    维护 4个值 区间最大值 区间最小值 从左往右跑最大收益 从右往左跑最大收益 
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define maxn 200010
    #define inf 0x7fffffff
    using namespace std;
    int n,m,num,a[maxn];
    struct node
    {
        int lc,rc;
        int l,r;
        int smin,smax;
        int ansl,ansr;
    }t[maxn*4];
    int init()
    {
        int x=0;char s;bool f=0;s=getchar();
        while(s<'0'||s>'9')s=getchar();
        while(s>='0'&&s<='9')
          {
              x=x*10+s-'0';
              s=getchar();
          }
        return x;
    }
    void update(int k)
    {
        t[k].smin=min(t[t[k].lc].smin,t[t[k].rc].smin);
        t[k].smax=max(t[t[k].lc].smax,t[t[k].rc].smax);
        t[k].ansl=max(t[t[k].lc].ansl,t[t[k].rc].ansl);
        t[k].ansl=max(t[k].ansl,t[t[k].rc].smax-t[t[k].lc].smin);
        t[k].ansr=max(t[t[k].lc].ansr,t[t[k].rc].ansr);
        t[k].ansr=max(t[k].ansr,t[t[k].lc].smax-t[t[k].rc].smin);
    }
    void Build(int ll,int rr)
    {
        int k=++num;
        t[k].l=ll;t[k].r=rr;
        if(ll==rr)
          {
            t[k].smin=t[k].smax=a[ll];
            return;
          }
        t[k].lc=num+1;
        Build(ll,(ll+rr)/2);
        t[k].rc=num+1;
        Build((ll+rr)/2+1,rr);
        update(k);
    }
    int findmin(int k,int ll,int rr)
    {
        if(ll<=t[k].l&&rr>=t[k].r)return t[k].smin;
        int mid=(t[k].l+t[k].r)/2;
        if(rr<=mid)return findmin(t[k].lc,ll,rr);
        else if(ll>mid)return findmin(t[k].rc,ll,rr);
        else return min(findmin(t[k].lc,ll,mid),findmin(t[k].rc,mid+1,rr));
    }
    int findmax(int k,int ll,int rr)
    {
        if(ll<=t[k].l&&rr>=t[k].r)return t[k].smax;
        int mid=(t[k].l+t[k].r)/2;
        if(rr<=mid)return findmax(t[k].lc,ll,rr);
        else if(ll>mid)return findmax(t[k].rc,ll,rr);
        else return max(findmax(t[k].lc,ll,mid),findmax(t[k].rc,mid+1,rr));
    }
    int findl(int k,int ll,int rr)
    {
        if(ll<=t[k].l&&rr>=t[k].r)return t[k].ansl;
        int mid=(t[k].l+t[k].r)/2;
        if(rr<=mid)return findl(t[k].lc,ll,rr);
        else if(ll>mid)return findl(t[k].rc,ll,rr);
        else
          {
              int maxx=0;
              maxx=max(findl(t[k].lc,ll,mid),findl(t[k].rc,mid+1,rr));
              maxx=max(maxx,findmax(t[k].rc,mid+1,rr)-findmin(t[k].lc,ll,mid));
              return maxx;
          }
    }
    int findr(int k,int ll,int rr)
    {
        if(ll<=t[k].l&&rr>=t[k].r)return t[k].ansr;
        int mid=(t[k].l+t[k].r)/2;
        if(rr<=mid)return findr(t[k].lc,ll,rr);
        else if(ll>mid)return findr(t[k].rc,ll,rr);
        else
          {
              int maxx=0;
              maxx=max(findr(t[k].lc,ll,mid),findr(t[k].rc,mid+1,rr));
              maxx=max(maxx,findmax(t[k].lc,ll,mid)-findmin(t[k].rc,mid+1,rr));
              return maxx;
          }
    }
    int main()
    {
        n=init();
        for(int i=1;i<=n;i++)
          a[i]=init();
        for(int i=1;i<=maxn*2;i++)
          t[i].smin=inf;
        Build(1,n);
        int x,y;
        m=init();
        for(int i=1;i<=m;i++)
          {
              x=init();y=init();
              if(x==y)
                {
                    printf("0
    ");
                    continue;
              }
            if(x<y)printf("%d
    ",findl(1,x,y));
            else printf("%d
    ",findr(1,y,x));
          }
        return 0;
    }
  • 相关阅读:
    记一道乘法&加法线段树(模版题)
    2021CCPC网络赛(重赛)题解
    Codeforces Round #747 (Div. 2)题解
    F. Mattress Run 题解
    Codeforces Round #744 (Div. 3) G题题解
    AtCoder Beginner Contest 220部分题(G,H)题解
    Educational Codeforces Round 114 (Rated for Div. 2)题解
    Codeforces Global Round 16题解
    Educational Codeforces Round 113 (Rated for Div. 2)题解
    AtCoder Beginner Contest 182 F
  • 原文地址:https://www.cnblogs.com/yanlifneg/p/5469203.html
Copyright © 2011-2022 走看看