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;
    }

     

  • 相关阅读:
    MAC LAMP环境 php执行使用问题
    centos 服务器 安全设置
    Linux系统发现占用CPU达100%的进程并处理
    git 使用国内镜像 ,查看镜像更改情况
    mac安装composer
    MySql反向模糊查询
    Linux启动或重启网卡
    MAMP环境 nginx配置忽略index.php入口文件
    php 验证码生成 不保存的情况下 缩小图片质量
    KMP字符串模式匹配详解
  • 原文地址:https://www.cnblogs.com/Never-mind/p/8984324.html
Copyright © 2011-2022 走看看