常见结论与例题

news/2025/10/24 13:23:30/文章来源:https://www.cnblogs.com/xihegudi/p/19163024

常见结论

题意:(区间移位问题)要求将整个序列左移/右移若干个位置,例如,原序列为 \(A=(a_1, a_2, \dots, a_n)\) ,右移 \(x\) 位后变为 \(A=(a_{x+1}, a_{x+2}, \dots, a_n,a_1,a_2,\dots, a_x)\)

区间的端点只是一个数字,即使被改变了,通过一定的转换也能够还原,所以我们可以 \(\mathcal O(1)\) 解决这一问题。为了方便计算,我们规定下标从 \(0\) 开始,即整个线段的区间为 \([0, n)\) ,随后,使用一个偏移量 shift 记录。使用 shift = (shift + x) % n; 更新偏移量;此后的区间查询/修改前,再将坐标偏移回去即可,下方代码使用区间修改作为示例。

cin >> l >> r >> x;
l--; // 坐标修改为 0 开始
r--;
l = (l + shift) % n; // 偏移
r = (r + shift) % n;
if (l > r) { // 区间分离则分别操作segt.modify(l, n - 1, x);segt.modify(0, r, x);
} else {segt.modify(l, r, x);
}

常见例题

题意:(带修莫队 - 维护队列)要求能够处理以下操作:

  • 'Q' l r :询问区间 \([l,r]\) 有几个颜色;
  • 'R' idx w :将下标 \(\tt idx\) 的颜色修改为 \(\tt w\)

输入格式为:第一行 \(n\)\(q\ (1\le n, q\le 133333)\) 分别代表区间长度和操作数量;第二行 \(n\) 个整数 \(a_1,a_2\dots,a_n\ (1\le a_i\le 10^6)\) 代表初始颜色;随后 \(q\) 行为具体操作。

const int N = 1e6 + 7;
signed main() {int n, q;cin >> n >> q;vector<int> w(n + 1);for (int i = 1; i <= n; i++) {cin >> w[i];}vector<array<int, 4>> query = {{}}; // {左区间, 右区间, 累计修改次数, 下标}vector<array<int, 2>> modify = {{}}; // {修改的值, 修改的元素下标}for (int i = 1; i <= q; i++) {char op;cin >> op;if (op == 'Q') {int l, r;cin >> l >> r;query.push_back({l, r, (int)modify.size() - 1, (int)query.size()});} else {int idx, w;cin >> idx >> w;modify.push_back({w, idx});}}int Knum = 2154; // 计算块长vector<int> K(n + 1);for (int i = 1; i <= n; i++) { // 固定块长K[i] = (i - 1) / Knum + 1;}sort(query.begin() + 1, query.end(), [&](auto x, auto y) {if (K[x[0]] != K[y[0]]) return x[0] < y[0];if (K[x[1]] != K[y[1]]) return x[1] < y[1];return x[3] < y[3];});int l = 1, r = 0, val = 0;int t = 0; // 累计修改次数vector<int> ans(query.size()), cnt(N);for (int i = 1; i < query.size(); i++) {auto [ql, qr, qt, id] = query[i];auto add = [&](int x) -> void {if (cnt[x] == 0) ++ val;++ cnt[x];};auto del = [&](int x) -> void {-- cnt[x];if (cnt[x] == 0) -- val;};auto time = [&](int x, int l, int r) -> void {if (l <= modify[x][1] && modify[x][1] <= r) { //当修改的位置在询问期间内部时才会改变num的值del(w[modify[x][1]]);add(modify[x][0]);}swap(w[modify[x][1]], modify[x][0]); //直接交换修改数组的值与原始值,减少额外的数组开销,且方便复原};while (l > ql) add(w[--l]);while (r < qr) add(w[++r]);while (l < ql) del(w[l++]);while (r > qr) del(w[r--]);while (t < qt) time(++t, ql, qr);while (t > qt) time(t--, ql, qr);ans[id] = val;}for (int i = 1; i < ans.size(); i++) {cout << ans[i] << endl;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/945209.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单芯片方案分享-CH336F-USB拓展坞+百兆网卡+读卡器+100W快充芯片

CH336F是符合USB2.0协议规范的 3端口HUB、USB高速读卡器、USB PD快充和USB转以太网四合一控制器芯片,该芯片集成 3口USB HUB、USB高速SD卡读卡器、USB PD快充和USB百兆以太网扩展功能。简介 CH336F是符合USB2.0协议规…

于状压的线性 RMQ 算法

基于状压的线性 RMQ 算法 严格 \(\mathcal O(N)\) 预处理,\(\mathcal O(1)\) 查询。 template<class T, class Cmp = less<T>> struct RMQ {const Cmp cmp = Cmp();static constexpr unsigned B = 64;usi…

Flink编程模型 - 详解

Flink编程模型 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "…

工业4.0下的边缘存储设计:材料就地处理,响应更快更安全

工业4.0下的边缘存储设计:材料就地处理,响应更快更安全pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas…

服务器关机用halt、poweroff还是shutdown -h now?一文帮你说明

我们需要对服务器进行关机的时候,选择必要的关机命令是非常重要的,本文将帮你说明linux系统中halt、poweroff及shutdown -h now 三个命令的区别并描述底层原理 一. halt功能:停止系统运行,但不一定关闭电源。行为:…

KD Tree

KD Tree 在第 \(k\) 维上的单次查询复杂度最坏为 \(\mathcal O(n^{1-k^{-1}})\)。 struct KDT {constexpr static int N = 1e5 + 10, K = 2;double alpha = 0.725;struct node {int info[K];int mn[K], mx[K];} tr[N];…

小波矩阵树:高效静态区间第 K 大查询

小波矩阵树:高效静态区间第 K 大查询 手写 bitset 压位,以 \(\mathcal O(N \log N)\) 的时间复杂度和 \(\mathcal O(N + \frac{N \log N}{64})\) 的空间建树后,实现单次 \(\mathcal O(\log N)\) 复杂度的区间第 \(k…

Seata用法

目录AT模式TCCSAGA模式参考资料 AT模式在Springboot启动程序加上,@EnableAutoDataSourceProxy 确保数据源被代理 在全局事务启动的方法上加 @GlobalTransactional 分支事务代码无需做任何处理。TCC 实现类加上 @Local…

Day3多媒体标签——视频与音频

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width= , initial-scale=1.0"><title&g…

分数运算类

分数运算类 定义了分数的四则运算,如果需要处理浮点数,那么需要将函数中的 gcd 运算替换为 fgcd 。 template<class T> struct Frac {T x, y;Frac() : Frac(0, 1) {}Frac(T x_) : Frac(x_, 1) {}Frac(T x_, T …

坐标压缩与离散化

坐标压缩与离散化 简单版本 sort(alls.begin(), alls.end()); alls.erase(unique(alls.begin(), alls.end()), alls.end()); auto get = [&](int x) {return lower_bound(alls.begin(), alls.end(), x) - alls.beg…

撸一个功能强大的基于语义的图像检索系统

构建了一个支持中英文和图像检索的自定义系统。通过PyQt5开发GUI界面,集成KimiAI实现中文翻译,解决了原生框架中文支持差、界面固定等问题。系统核心功能包括:1)中文文本检索(自动翻译为英文);2)以图搜图(基于…

提交一张 PPT,参与 RTE2025 全球语音智能体云展示

无法亲临 RTE2025 大会?😢 没关系!🎉 我们特别为你的项目提供了一个云展示机会。只需提交一张 PPT,即可参与我们的「全球语音智能体云展示」,与众多领先的语音智能体一同在大会展区屏幕上轮播展示! 🤩项目提…

完整教程:深入解析AppCrawler:开源自动遍历测试工具配置指南

完整教程:深入解析AppCrawler:开源自动遍历测试工具配置指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Con…

解释 EIP-4337

简单来说,EIP-4337 旨在实现“账户抽象”,让智能合约钱包成为用户的默认和主流钱包,从而极大地改善用户体验和安全性。 下面我将从几个方面详细解释 EIP-4337: 1. 核心问题:以太坊的两种账户 在理解 EIP-4337 之前…

数论常见结论及例题

数论常见结论及例题 常见结论 球盒模型(八种) 参考链接。给定 \(n\) 个小球 \(m\) 个盒子。球同,盒不同、不能空隔板法: \(N\) 个小球即一共 \(N-1\) 个空,分成 \(M\) 堆即 \(M-1\) 个隔板,答案为 \(\dbinom{n-1…

材料包含与下载漏洞

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

N8N Workflow Collection - 专业级自动化工作流库 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

完整教程:Elasticsearch面试精讲 Day 23:安全认证与权限控制

完整教程:Elasticsearch面试精讲 Day 23:安全认证与权限控制pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Con…

Min25 筛

Min25 筛 求解 \(1-N\) 的质数和,其中 \(N \le 10^{10}\) 。 namespace min25{const int N = 1000000 + 10;int prime[N], id1[N], id2[N], flag[N], ncnt, m;LL g[N], sum[N], a[N], T;LL n;LL mod;inline LL ps(LL …