h0148. 66 (30 分)

简介: h0148. 66 (30 分)

定义一个6位二进制数上的运算 @ : a@b=(c,d)。其中 c = a的高3位b的低3位 ; d = a的低3位b的高3位。例如 010 001 @ 011 001 = (010001 , 001011) = (21,13) = (2,3) 。 给出了两个操作数a和b,以及一个数列 x1,x2,x3 ... xn。假设a@b的结果(c,d),数列在区间 [ min(c,d)*min(a,b) ,max(c,d)*max(a,b) ]上的最小值和最大值。如果上述区间上的最大值和最小值可以代表666的程度,请你每组操作数都要计算出这两个最值。


输入格式:

第一行输入两个正整数 n,q,分别表示数列数字的个数和询问个数.其中1<=n<=50 000,1<=q<=100 000。 第二行输入n个非负整数,表示数列中的元素x1,x2 ... xn, 每个元素都在int类型的范围内。 接下来q行,每行给出一对非负整数,a,b,其意义见题面。本题保证所有的a和b均为6位无符号整数。


输出格式:

对于每个询问,输出一对整数,分别表示目标区间上的最大值和最小值.每个询问的结果单独占一行。 请不要输出多余的空行。


输入样例:

1. 12 1
2. 5 2 3 4 5 6 7 8 1 6 5 1
3. 1 8


输出样例:

8 2


注意:

min(x,y)表示x和y的最小值, max(x,y)表示x和y的最大值.区间下标从1开始。 样例: 数列在区间[1,8]上的所有元素为{5 2 3 4 5 6 7 8},最大值为8,最小值为2。 若左边界越界则取1,若右边界越界则取n。


思路:先预处理所有可能的答案,然后直接查表

时间复杂度:4096 * 4096 + 100000

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10,inf = 0x3f3f3f3f;
const int M = 4096 + 10;
int maxx[M][M],minn[M][M];
int f[N],n;
void check(int a,int b,int &l,int &r)
{
    int a1,a2,b1,b2;
    a1 = a >> 3;//a的高3位
    a2 = a - (a1 << 3);//a的低3位
    b1 = b >> 3;//b的高三位
    b2 = b - (b1 << 3);//b的低三位
    l = a1 * b2;//c
    r = a2 * b1;//d
    if(l > r) swap(l,r);
    l *= min(a,b);
    r *= max(a,b);
    if(l < 1 || l > n) l = 1;
    if(r < 1 || r > n) r = n;
}
int find_max(int l,int r)
{
    int maxc = -1;
    for(int i=l;i<=r;i++)
        maxc = max(maxc,f[i]);
    return maxc;
}
int find_min(int l,int r)
{
    int minc = inf;
    for(int i=l;i<=r;i++)
        minc = min(minc,f[i]);
    return minc;
}
int main()
{
    int q,l,r;
    cin>>n>>q;
    for(int i=1;i<=n;i++) scanf("%d",&f[i]);
    for(int i=0;i<=64;i++)//预处理
    {
        for(int j=0;j<=64;j++)
        {
            check(i,j,l,r);
            maxx[l][r] = find_max(l,r);
            minn[l][r] = find_min(l,r);
        }
    }
    int a,b;
    while(q -- )
    {
        scanf("%d%d",&a,&b);
        check(a,b,l,r);
        printf("%d %d\n",maxx[l][r],minn[l][r]);
    }
    return 0;
}



目录
相关文章
|
机器学习/深度学习 C语言
【C/PTA】选择结构专项练习
【C/PTA】选择结构专项练习
559 0
|
11月前
|
存储 编译器 C语言
【C语言】指针大小知多少 ?一场探寻C语言深处的冒险 !
在C语言中,指针的大小(即指针变量占用的内存大小)是由计算机的体系结构(例如32位还是64位)和编译器决定的。
1307 9
|
安全 编译器 异构计算
在CPU设计中,为了提高能效比并减少能源消耗,采用了多种节能技术
【10月更文挑战第2天】在CPU设计中,为了提高能效比并减少能源消耗,采用了多种节能技术
397 5
IDEA同一项目启动在不同端口方法
IDEA同一项目启动在不同端口方法
1792 0
|
存储 数据库 数据库管理
什么是数据库
什么是数据库。
430 2
|
测试技术 BI
性能基准测试基本流程
性能基准测试基本流程
281 1
|
机器学习/深度学习 人工智能
【C/PTA】数组进阶练习(三)
【C/PTA】数组进阶练习(三)
618 0
|
开发者
如何画好一张架构图/业务图/流程图,掌握这4个关键点
作为一个开发,日常工作中免不了要画一些图,无论是技术架构图还是业务流程图。基于个人的一些经验,作者分享了他的作图方法,给大家一点思路提供参考,希望在未来的工作、生活中都能有所帮助。
|
编译器 C语言 C++
VSCode上搭建C/C++开发环境(vscode配置c/c++环境)Windows系统---保姆级教程
VSCode上搭建C/C++开发环境(vscode配置c/c++环境)Windows系统---保姆级教程
10615 0
|
Kubernetes 网络协议 Java
Seata常见问题之全局事务处理中的本地会话过多 seata1.7报错如何解决
Seata 是一个开源的分布式事务解决方案,旨在提供高效且简单的事务协调机制,以解决微服务架构下跨服务调用(分布式场景)的一致性问题。以下是Seata常见问题的一个合集
432 0