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

     

  • 相关阅读:
    CodeForces 7B
    CodeForces 4D
    离散化
    线段树入门
    洛谷 P3951 小凯的疑惑(赛瓦维斯特定理)
    Codeforces 1295D Same GCDs (欧拉函数)
    Codeforces 1295C Obtain The String (二分)
    Codeforces 1295B Infinite Prefixes
    Codeforces 1295A Display The Number(思维)
    Codeforces 1294F Three Paths on a Tree(树的直径,思维)
  • 原文地址:https://www.cnblogs.com/Never-mind/p/8984324.html
Copyright © 2011-2022 走看看