当前位置: 首页 > news >正文

Chef and Churu 题解

Problem

CodeChef FNCS - Chef and Churu

Analysis

下文令 $n,m$ 同阶。
感觉不是很好套线段树等数据结构,那就考虑暴力分块吧。
设块长为 $B$。
首先考虑对 $n$ 个区间分块,预处理出 $f_{i,j}$ 为第 $j$ 个数在第 $i$ 个块中出现次数,这个可以利用差分解决,复杂度为 $O(\frac{n^2}{B})$。
令 $ans_i$ 为第 $i$ 个块所有区间值的和。
然后考虑操作:

  1. 修改操作:枚举每个块,更新答案 $ans_i\gets ans_i-f_{i,x}a_x+f_{i,x}y$,复杂度为 $O(\frac{n^2}{B})$。
  2. 查询操作:
    • 对于整块,直接累加 $ans_i$ 就行,复杂度为 $O(B)$。
    • 对于散块,无法直接计算,需要在块上建立线段树求区间和,复杂度为 $O(B\log B)$。
    • 总复杂度为 $O(nB\log B)$,$10^8$ 级别,较难通过。

在查询遇到问题,继续优化,多加一个原序列上分块,然后每个值维护原序列上的前缀和 $s_i$。
此时预处理复杂度不变,考虑操作:

  1. 修改分在序列块和区间块:在序列块上就修改 $[x,n]$ 中块的值 $s_i$;在区间块上与之前的做法一样。复杂度为 $O(\frac{n^2}{B})$。
  2. 查询整块就直接加区间块上的 $ans_i$,散块在序列块上做差分,复杂度为 $O(nB)$。
    于是总复杂度为 $O(nB+\frac{n^2}{B})$,当 $B=\sqrt{n}$ 时有最小值 $O(n\sqrt{n})$。

AC Code

// Problem: Chef and Churu
#include <bits/stdc++.h>
#define fi first
#define se second
#define PII pair<int, int>
#define ll long long 
#define ull unsigned long long 
using namespace std;const int N = 1e5 + 10, M = 350;int n, q;
int a[N];
int L[N], R[N];
int diff[N];
int blen, id[N], bl[N], br[N];
ull s[N], tag[M]; // 序列块
ull f[M][N], ans[M]; // 区间块void build(int n) {blen = sqrt(n);for (int i = 1; i <= blen; i ++) {bl[i] = br[i - 1] + 1, br[i] = i * blen;}if (br[blen] < n) {blen ++;bl[blen] = br[blen - 1] + 1, br[blen] = n;}for (int i = 1; i <= blen; i ++) {for (int j = bl[i]; j <= br[i]; j ++) {id[j] = i;diff[L[j]] ++, diff[R[j] + 1] --;}for (int j = 1; j <= n; j ++) {diff[j] += diff[j - 1];diff[j - 1] = 0;f[i][j] = diff[j];ans[i] += 1ll * diff[j] * a[j];}diff[n] = 0;}
}void modify(int ql, int qr, int w) {int p = id[ql], q = id[qr];// cout << p << " " << q << '\n';if (p == q) {for (int i = ql; i <= qr; i ++) s[i] += w;}else {for (int i = p + 1; i <= q - 1; i ++) tag[i] += w;for (int i = ql; i <= br[p]; i ++) s[i] += w;for (int i = bl[q]; i <= qr; i ++) s[i] += w;}for (int i = 1; i <= blen; i ++) {ans[i] += f[i][ql] * w;}
}ull query(int ql, int qr) {ull sum = 0;int p = id[ql], q = id[qr];if (p == q) {for (int i = ql; i <= qr; i ++) {sum += s[R[i]] + tag[id[R[i]]] - (s[L[i] - 1] + tag[id[L[i] - 1]]);  }}else {for (int i = p + 1; i <= q - 1; i ++) sum += ans[i];for (int i = ql; i <= br[p]; i ++) {sum += s[R[i]] + tag[id[R[i]]] - (s[L[i] - 1] + tag[id[L[i] - 1]]);}for (int i = bl[q]; i <= qr; i ++) {sum += s[R[i]] + tag[id[R[i]]] - (s[L[i] - 1] + tag[id[L[i] - 1]]);}}return sum;
}int main() {ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);cin >> n;for (int i = 1; i <= n; i ++) {cin >> a[i];s[i] = s[i - 1] + a[i];}for (int i = 1; i <= n; i ++) {cin >> L[i] >> R[i];}build(n);cin >> q;while (q --) {int opt, x, y;cin >> opt >> x >> y;if (opt == 1) {modify(x, n, y - a[x]);a[x] = y;}else {cout << query(x, y) << '\n';}}return 0;
}
http://www.jsqmd.com/news/362791/

相关文章:

  • 直播美颜SDK人脸美型实战:从接入到调优的完整经验总结
  • jsp大学生学业信息管理系统64qby(程序+源码+数据库+调试部署+开发环境)
  • 基于DRU-HVDC的构网型海上风电场环流机理仿真复现
  • 类似Jira的软件哪个更适合大型团队?2025年-2026年推荐与排名,解决扩展性与本土化支持痛点 - 品牌推荐
  • loadingUI组件绑定的一个特例
  • 我帮你省时间:一键查看 TRTC 音视频 + IM 功能
  • 2026年散酒加盟公司权威推荐:泸州酒贴牌代加工、浓香白酒贴牌、清香白酒贴牌、白酒 oem 贴牌、白酒代理加盟选择指南 - 优质品牌商家
  • 百思数据治理大模型(BS-LM)技术白皮书(下篇)
  • 基于SpringBoot的膳食营养健康网站毕设源码
  • 百思数据治理大模型(BS-LM)技术白皮书(上篇)
  • Day32事件委托版本tab栏切换
  • 基于SpringBoot的画师约稿平台毕业设计
  • 基于SpringBoot的物流信息管理系统毕业设计
  • 敏捷转型如何选择工具?2025年-2026年Jira替代软件推荐与评价,解决学习成本与本地化适配痛点 - 品牌推荐
  • 本地达成斯坦福小镇(利用大语言模型使虚拟角色自主发展剧情)类似工程“Microverse”
  • 2026天津可靠红木家具回收品牌推荐指南 - 优质品牌商家
  • 支付宝立减金回收三大误区解析与避坑指南 - 京顺回收
  • 大规模复杂需求如何管理?2025年-2026年需求管理系统推荐与排名,直击可视化与闭环追溯核心痛点 - 品牌推荐
  • 数据中台建设方法论:大数据项目成功的关键要素
  • 如何为强监管场景选需求管理软件?2025年-2026年需求管理软件推荐与评测,直击合规与追溯痛点 - 品牌推荐
  • 2026.2.9 模拟赛
  • FPGA实现双线性插值缩放:代码与实现详解
  • SpringBoot配置终极指南:从入门到精通
  • Command Injection(命令注入)漏洞及其防御策略
  • 2026年2月气体分析仪厂商推荐,工业气体检测设备厂家口碑榜 - 品牌鉴赏师
  • BISHI29 小红的排列构造①
  • 2026年红木家具回收公司权威推荐:紫檀家具回收、红木家具上门回收、红木家具回收价格、红木家具回收平台选择指南 - 优质品牌商家
  • FastAPI系列(24):ORM操作之删除接口开发
  • 强监管行业如何确保项目合规?2025年-2026年项目集管理系统推荐与评价,解决审计追溯与安全管控核心难题 - 品牌推荐
  • 2025年-2026年瀑布管理系统推荐:大型复杂项目场景深度评测,解决流程割裂与合规痛点并附排名 - 品牌推荐