zoukankan      html  css  js  c++  java
  • BZOJ5042: LWD的分科岛

    【传送门:BZOJ5042


    简要题意:

      给出n个数,q个询问,每个询问输入opt,l,r,如果opt=1,则输出l到r中的最小值,否则输出最大值


    题解:

      直接上ST表,自信一波,结果

      MLE??好吧,离线求,最大最小值用一个数组求

      TLE???好吧,看讨论,询问的范围1000左右,好,缩一波时间

      RE????好吧,不预处理2的次方,直接位运算

      AC??好吧,ok了


    参考代码:

    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    int m[15][3100000];
    int Log[3100000];
    struct question
    {
        int l,r,opt,d;
    }q[2100000];
    int main()
    {int n=read(),Q=read();
        for(int i=1;i<=n;i++)
        {
            int x=read();
            m[0][i]=x;
        }
        Log[0]=-1;for(int i=1;i<=n;i++) Log[i]=Log[i>>1]+1;
        for(int i=1;(1<<i)<=n&&i<=10;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(j+(1<<i)-1<=n)
                {
                    m[i][j]=min(m[i-1][j],m[i-1][j+(1<<(i-1))]);
                }
                else break;
            }
        }
        for(int i=1;i<=Q;i++) q[i].opt=read(),q[i].l=read(),q[i].r=read();
        for(int i=1;i<=Q;i++)
        {
            int opt=q[i].opt,l=q[i].l,r=q[i].r;
            if(q[i].opt==1)
            {
                int t=Log[r-l+1];
                q[i].d=min(m[t][l],m[t][r-(1<<t)+1]);
            }
        }
        for(int i=1;(1<<i)<=n&&i<=10;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(j+(1<<i)-1<=n)
                {
                    m[i][j]=max(m[i-1][j],m[i-1][j+(1<<(i-1))]);
                }
                else break;
            }
        }
        for(int i=1;i<=Q;i++)
        {
            int opt=q[i].opt,l=q[i].l,r=q[i].r;
            if(q[i].opt==2)
            {
                int t=Log[r-l+1];
                q[i].d=max(m[t][l],m[t][r-(1<<t)+1]);
            }
        }
        for(int i=1;i<=Q;i++) printf("%d
    ",q[i].d);
        return 0;
    }

     

  • 相关阅读:
    ClickOnce發布經驗
    reporting Server組件不全引起的致命錯誤
    異步調用
    Usercontrol Hosted in IE
    MATLAB命令大全(转载)
    一种保护眼睛的好方法
    关于oracle自动编号
    An Algorithm Summary of Programming Collective Intelligence (1)
    An Algorithm Summary of Programming Collective Intelligence (3)
    An Algorithm Summary of Programming Collective Intelligence (4)
  • 原文地址:https://www.cnblogs.com/Never-mind/p/8984324.html
Copyright © 2011-2022 走看看