“玲珑杯”线上赛 Round #15 河南专场 G -- 咸鱼拷问 RMQ

本文解析了一道名为“咸鱼拷问”的编程题,该题要求计算一系列特定的“咸鱼值”。通过使用线段树和差分技巧,文章详细介绍了如何高效地求解区间最小值和最大值,最终得到所有咸鱼值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目连接:G -- 咸鱼拷问

G -- 咸鱼拷问

Time Limit:3s Memory Limit:128MByte

Submissions:366Solved:111

DESCRIPTION

给你两个序列A,B。每个序列有N个元素,我们定义第i个位置的咸鱼值为min(A[i],A[i-1]…A[i-B[i]+1])*max(A[i],A[i-1]….A[i-B[i]+1]).。
现在咸鱼王想知道所有的咸鱼值,于是抓住了你,让你回答这道题。
你能回答他吗?

INPUT
第一行包括一个整数N(1<=N<=1e5)第二行包括N个整数,表示为A[i] (|A[i]| <= 10^9)第三行包括N个整数,表示为B[i] ( 1 <= B[i] <= i)
OUTPUT
输出N行,第i行表示第i个咸鱼值。
SAMPLE INPUT
5
1 2 3 4 5
1 2 1 2 3
SAMPLE OUTPUT
1
2
9
12
15

题目分析:RMQ求区间最值,模板题

//
//  main.cpp
//  G -- 咸鱼拷问
//
//  Created by teddywang on 2017/5/30.
//  Copyright © 2017年 teddywang. All rights reserved.
//

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
ll s[400010];
ll t[400010];
ll idx[400090];
ll idy[400010];
ll n;
ll lowbit(ll x)
{
    return x&(-x);
}

void init()
{
    for(int i=1;i<=n;i++)
    {
        idx[i]=s[i];
        idy[i]=s[i];
        for(int j=1;j<lowbit(i);j<<=1)
        {
            idx[i]=min(idx[i],idx[i-j]);
            idy[i]=max(idy[i],idy[i-j]);
        }
    }
}


ll querymin(int l,int r)
{
    ll ans=s[r];
    while(1)
    {
        ans=min(ans,s[r]);
        if(l==r)   break;
        for(r-=1;r-l>=lowbit(r);r-=lowbit(r))
            ans=min(ans,idx[r]);
    }
    return ans;
}

ll querymax(int l,int r)
{
    ll ans=s[r];
    while(1)
    {
        ans=max(ans,s[r]);
        if(l==r)   break;
        for(r-=1;r-l>=lowbit(r);r-=lowbit(r))
            ans=max(ans,idy[r]);
    }
    return ans;
}

int main()
{
    while(~scanf("%lld",&n))
    {
        memset(idx,0,sizeof(idx));
        memset(idy,0,sizeof(idy));
        for(int i=1;i<=n;i++)
        {
            scanf("%lld",&s[i]);
        }
        for(int i=1;i<=n;i++)
        {
            scanf("%lld",&t[i]);
        }
        init();
        for(int i=1;i<=n;i++)
        {
            int l=i-t[i]+1;
            int r=i;
            //cout<<l<<" "<<r<<endl;
            ll maxn=querymax(l,r);
            ll minn=querymin(l,r);
            ll ans=maxn*minn;
            printf("%lld\n",ans);
        }
    }
}



当前问题涉及 `zip` 命令的 `-rmq` 参数用法,然而根据已知的标准文档和常见实践,`zip` 命令并没有名为 `-rmq` 的参数组合。以下是关于此问题的具体分析: --- ### 已知信息 1. **Zip命令基础** `zip` 是一种常用的压缩工具,在 Unix 和 Linux 系统中广泛使用。其基本语法如下: ```bash zip [选项] 压缩包名 文件或目录列表 ``` 2. **常用参数说明** - `-r`: 表示递归处理,将指定目录下的所有子目录和文件都包含在压缩包中。 - `-m`: 表示在压缩完成后删除原始文件。 - `-q`: 表示静默模式,不显示任何提示信息。 3. **未定义的参数** 经过查阅标准手册以及实际测试,`zip` 并不存在单独的 `-rmq` 参数组合。通常情况下,多个短选项可以连写在一起,例如 `-rmq` 可能被理解为 `-r`, `-m`, 和 `-q` 同时生效。但如果存在拼写错误或其他误解,则可能导致功能异常。 4. **关联上下文** 提供的引用内容主要围绕 RocketMQ 的消费者与生产者配置[^1][^2],以及性能优化建议[^3],并未提及有关 `zip` 或其参数的内容。因此推测该问题是独立提出的。 --- ### 正确用法示例 #### 示例 1: 使用 `-r` 参数递归压缩整个目录 ```bash zip -r archive_name.zip target_directory/ ``` 上述命令会将目标目录及其内部所有文件打包成一个 ZIP 归档文件。 #### 示例 2: 结合 `-m` 删除原文件并保持安静操作 ```bash zip -rmq final_archive.zip file1.txt folder1/ folder2/ ``` 这条指令实现了以下行为: - 将 `file1.txt`、`folder1/` 和 `folder2/` 添加至最终的 ZIP 文件; - 完成后自动移除这些源对象 (`-m`); - 整个过程无多余日志输出 (`-q`)。 注意:务必确认不需要保留原始数据后再启用 `-m`! --- ### 性能注意事项 虽然本主题聚焦于 `zip` 而非消息队列框架如 RocketMQ,但仍可借鉴部分原理来提高效率。例如当批量处理大量小型文件时,磁盘 I/O 成为主要瓶颈之一。此时可以通过调整操作系统级 IO 调度策略(如同 commitlog 随机读场景下推荐 Deadline 算法那样[^3]),或者预先整理待压缩素材减少碎片化程度等方式加速整体流程。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值