[NC] 仓鼠与珂朵莉-分块

简介: 给定一个长度为n的序列,m个询问每次给出一个区间,查找区间内x*cnt[x] 的最大值由于题目的限制,下一次询问的区间会受到上一次查询结果的影响,所以必须要进行强制在线处理首先将数列分成ceil(n/blk+1) 块,对于询问中b[l] + 1 -> b[r] - 1这一块中的答案我们可以通过预处理得到,这里的写法类似数列分块入门中的第九题查询区间众数然后需要做的就是暴力计算左右两边的小块的贡献在这个数据范围下,先进行离散化处理比较好,对于查询的结果可能比较大,所以数据类型上一定要开long long

b17bc765263d4aef997acd693ebce7fc.png

给定一个长度为n的序列,m个询问

每次给出一个区间,查找区间内x*cnt[x] 的最大值

由于题目的限制,下一次询问的区间会受到上一次查询结果的影响,所以必须要进行强制在线处理


首先将数列分成ceil(n/blk+1) 块,对于询问中b[l] + 1 -> b[r] - 1这一块中的答案我们可以通过预处理得到,这里的写法类似数列分块入门中的第九题查询区间众数


然后需要做的就是暴力计算左右两边的小块的贡献

在这个数据范围下,先进行离散化处理比较好,对于查询的结果可能比较大,所以数据类型上一定要开long long


ll n,m,a[maxn],b[maxn];
ll blk,mx[357][357],sum[357][maxn],id[maxn],c[357][maxn],cnt[maxn];
vector<ll> vet;
int get(ll x) {
  return lower_bound(vet.begin(),vet.end(),x) - vet.begin() + 1;
}
void pre(int i) {
  ll t = 0;
  Clear(cnt,0);
  for(int j = (i-1) * blk + 1; j<=n; j++) {
    cnt[id[j]] ++;
    t = max(t,cnt[id[j]] * a[j] * 1LL);
    mx[i][b[j]] = t;
  }
}
ll query(int l,int r) {
  ll ret = 0;
  if(b[l] == b[r]) { // in the same blk
    for(int i=l; i<=r; i++) cnt[id[i]] = 0;
    for(int i=l; i<=r; i++) cnt[id[i]] ++,ret = max(ret,cnt[id[i]] * a[i]);
    for(int i=l; i<=r; i++) cnt[id[i]] = 0;
    return ret;
  }
  if(b[l] + 1 <= b[r] - 1)
    ret = mx[b[l] + 1][b[r] - 1];
  for(int i=l; i<=min(n,b[l]*blk); i++) cnt[id[i]] = 0;
  for(int i=(b[r] - 1) * blk + 1; i<=r; i++) cnt[id[i]] = 0;
  for(int i=l; i<=min(n,b[l]*blk); i++) {
    cnt[id[i]] ++;
    ret = max(ret,cnt[id[i]]*a[i] + sum[b[r] - 1][id[i]] - sum[b[l]][id[i]]);
  }
  for(int i=(b[r]-1) * blk + 1; i<=r; i++) {
    cnt[id[i]] ++;
    ret = max(ret,cnt[id[i]]*a[i] + sum[b[r] - 1][id[i]] - sum[b[l]][id[i]]);
  }
  return ret;
}
int main() {
  n = read,m = read;
  blk = sqrt(n);
  for(int i=1; i<=n; i++) a[i] = read,vet.push_back(a[i]);
  sort(vet.begin(),vet.end());
  vet.erase(unique(vet.begin(),vet.end()),vet.end());
  int siz = vet.size();
  for(int i=1; i<=n; i++) {
    b[i] = (i - 1) / blk + 1;
    id[i] = get(a[i]);
    c[b[i]][id[i]] += a[i];
  }
  int lim = ceil(1.0 * n / blk);/// amt of the blks
  for(int i=1; i<=lim; i++) {
    for(int j = 1; j<=siz; j++) {
      sum[i][j] = sum[i-1][j];
      sum[i][j] += c[i][j];
    }
  }
  /// pre init
  for(int i=1; i<=lim; i++) pre(i);
  Clear(cnt,0);
  ll lastans = 0LL;
  for(int i=1; i<=m; i++) {
    ll l = read,r = read;
    l = (l ^ lastans) % n + 1;
    r = (r ^ lastans) % n + 1;
    if(l > r) swap(l,r);
    lastans = query(l,r);
    cout << lastans << endl;
  }
  return 0;
}
/**
5 5
9 8 7 8 9
0 1
10 11
9 9
11 9
16 19
9
8
8
16
16
**/


在这个题的预处理过程中,写法参考求众数的时候的方法

6444912caaa34f69897d501cb0623f51.png

目录
相关文章
|
编解码 物联网
LDPC 码在 3GPP 中的应用 | 带你读《5G-NR信道编码》之十八
本章节带你了解LDPC 码在 3GPP 中的应用。
LDPC 码在 3GPP 中的应用  | 带你读《5G-NR信道编码》之十八
|
6月前
|
机器学习/深度学习 人工智能 搜索推荐
一区9.3分top刊|多组学SNF数据融合的正确打开方式
这篇研究文章聚焦于多组学在揭示胎盘功能障碍中的作用,发表于2023年9月的《BMC Medicine》,IF为9.3。研究通过整合转录组学、蛋白质组学和代谢组学数据,鉴定出与常见产科综合征(如先兆子痫、胎儿生长受限和自发性早产)无关的胎盘集群。使用人工智能的无偏相似性网络融合(SNF)方法,分析发现四个不同的胎盘簇,其中早发性先兆子痫的簇显示强烈的功能障碍模式,而以自发性早产为主的簇则较弱。研究结果增加了对病理过程的理解,可能促进个性化干预措施的发展。
167 0
|
6月前
|
数据采集 网络协议 Linux
网络基础『发展 ‖ 协议 ‖ 传输 ‖ 地址』
网络基础『发展 ‖ 协议 ‖ 传输 ‖ 地址』
78 0
网络基础『发展 ‖ 协议 ‖ 传输 ‖ 地址』
|
6月前
|
算法 C语言
【牛客-算法】NC56 回文数字
🚩 前言 🔥 该专栏作为算法题笔记,记录算法的思路、遇到的问题,以及能跑的代码,持续更新中! 🔥 推荐一款面试、刷题神器牛客网:👉开始刷题学习👈
56 0
华为机试HJ18:识别有效的IP地址和掩码并进行分类统计
华为机试HJ18:识别有效的IP地址和掩码并进行分类统计
106 0
|
运维 网络安全
巧用 nc 命令传输文件
今天在业务上云的时候,遇到了些问题。最终发现问题的根源不好排查,于是——把生产环境的全量配置文件,还有日志全量打包下载到开发机器分析!生产和开发机内网不通,都是走公网传输,但是速度特别慢……
193 3
|
数据采集 数据可视化
揭秘水文覆盖变化!使用 R 语言轻松处理 MODIS .nc 文件
GRACE水文数据包括地表水蓄积(SWS)、土壤水蓄积(SSS)、总水蓄积(TWS)等变量,通常以每月为单位进行统计和融合,并以网格的形式提供各个区域的数据。 在这里,我们将通过使用 R 语言及其相关包对 GRACE 数据进行研究。具体来说,我们将使用 ncdf4 包读取 GRACE 的 .nc 数据,并进行数据的预处理和可视化分析。
164 0
|
索引
【牛客】NC107寻找峰值,HJ31单词倒排
【牛客】NC107寻找峰值,HJ31单词倒排
105 0
【牛客】NC107寻找峰值,HJ31单词倒排
PTA 1078 字符串压缩与解压 (20 分)
文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示。
108 0