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

     

  • 相关阅读:
    初级知识点四——设计模式六大原则
    初级知识点三——面向对象的三大特性
    初级知识点二——C#值传递
    初级知识点一——C#中的值类型与引用类型
    Unity资源引用问题
    Git在windows上的设置详解
    Unity中接收服务器消息并广播事件的实现
    Sphinx 自动化文档
    MAC Pro 同时安装 Python2 和 Python3
    数据中心网络架构演进 — 云网融合
  • 原文地址:https://www.cnblogs.com/Never-mind/p/8984324.html
Copyright © 2011-2022 走看看