CF1375H 做题记录

news/2025/4/3 2:42:32/文章来源:https://www.cnblogs.com/Sktn0089/p/18804984

link

这题严格来说应该算是数据结构题。

这里主要记录的是值域分块的另一大特殊用法:块内分治维护位置信息,块间直接合并。

比如这一题,我们先值域分块,设块长为 \(B\)。对于一个块内,一共有 \(\mathcal O(B)\) 个数,也就是在序列上有 \(\mathcal O(B^2)\) 种不同的区间,总数为 \(\mathcal O(nB)\) 级别,所以我们可以求出所有的区间信息。

但是合并必须是值域小的与值域大的合并,所以可以考虑按值域分治。比如当前分治区间 \([l, r]\) 表示块内第 \(l\) 小的数到第 \(r\) 小的数进行分治求解,在序列上一共有 \(\mathcal O((r - l) ^ 2)\) 种本质不同的区间,先左右递归子问题,然后枚举每个本质不同的区间,其数字集合由左右两边对应的区间数字集合合并而成。

询问直接依次合并每个值域块即可。取 \(B = \sqrt q\),复杂度为 \(\mathcal O(n\sqrt q)\)


观察这类问题的特点:

  • 有两个维度

  • 第一个维度需要按顺序依次合并

  • 第二个维度需要限定了一个区间

按照第一个维度分块,每个块内第二个维度利用分治求解。


点击查看代码
#include <bits/stdc++.h>
#define ll int
#define ull unsigned ll
#define fi first
#define se second
#define mkp make_pair
#define pir pair <ll, ll>
#define pb push_back
#define i128 __int128
using namespace std;
char buf[1 << 22], *p1, *p2;
// #define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, (1 << 22) - 10, stdin), p1 == p2)? EOF : *p1++)
template <class T>
const inline void rd(T &x) {char ch; bool neg = 0;while(!isdigit(ch = getchar()))if(ch == '-') neg = 1;x = ch - '0';while(isdigit(ch = getchar()))x = (x << 1) + (x << 3) + ch - '0';if(neg) x = -x;
}
const ll maxn = 4101, inf = 1e9, mod = 998244353, M = 22e5 + 10;
ll power(ll a, ll b = mod - 2) {ll s = 1;while(b) {if(b & 1) s = 1ll * s * a %mod;a = 1ll * a * a %mod, b >>= 1;} return s;
}
template <class T, class _T>
const inline ll pls(const T x, const _T y) { return x + y >= mod? x + y - mod : x + y; }
template <class T, class _T>
const inline void add(T &x, const _T y) { x = x + y >= mod? x + y - mod : x + y; }
template <class T, class _T>
const inline void chkmax(T &x, const _T y) { x = x < y? y : x; }
template <class T, class _T>
const inline void chkmin(T &x, const _T y) { x = x < y? x : y; }ll n, m, a[maxn], b[maxn], B, bl[maxn], id[maxn][maxn], h[maxn], tot;
vector <ll> vec[maxn]; ll f[M], g[M], _id[maxn][maxn];
ll lc[M], rc[M], ans[1 << 17], ql[1 << 17], qr[1 << 17], c[1 << 17];void solve(vector <ll> &vec, ll l, ll r) {if(l == r) return id[h[vec[l]]][h[vec[l]]] = vec[l], void();ll mid = l + r >> 1, ap = a[vec[mid]];solve(vec, l, mid), solve(vec, mid + 1, r);sort(vec.begin() + l, vec.begin() + r + 1);for(ll i = l; i <= r; i++)for(ll j = i; j <= r; j++)_id[h[vec[i]]][h[vec[j]]] = id[h[vec[i]]][h[vec[j]]];for(ll i = l; i <= r; i++) {ll l1 = n, r1 = 0, l2 = n, r2 = 0;for(ll j = i; j <= r; j++) {if(a[vec[j]] <= ap)chkmin(l1, h[vec[j]]), chkmax(r1, h[vec[j]]);elsechkmin(l2, h[vec[j]]), chkmax(r2, h[vec[j]]);if(l1 <= r1 && l2 <= r2) {++tot, lc[tot] = _id[l1][r1], rc[tot] = _id[l2][r2];id[h[vec[i]]][h[vec[j]]] = tot;}}}
}int main() {rd(n), rd(m); B = sqrt(m), tot = n;for(ll i = 1; i <= n; i++) bl[i] = (i - 1) / B + 1;for(ll i = 1; i <= n; i++) rd(a[i]), b[a[i]] = i, f[i] = g[i] = a[i];for(ll i = 1; i <= n; i++) vec[bl[i]].pb(b[i]);for(ll i = 1; i <= m; i++) rd(ql[i]), rd(qr[i]);for(ll u = 1; u <= bl[n]; u++) {auto tmp = vec[u];sort(tmp.begin(), tmp.end());for(ll i = 0; i < tmp.size(); i++) h[tmp[i]] = i;solve(vec[u], 0, vec[u].size() - 1);for(ll i = 1; i <= m; i++) {ll p = lower_bound(vec[u].begin(),vec[u].end(), ql[i]) - vec[u].begin();ll q = upper_bound(vec[u].begin(),vec[u].end(), qr[i]) - vec[u].begin() - 1;if(p > q) continue;if(c[i]) {++tot, lc[tot] = c[i], rc[tot] = id[p][q];c[i] = tot;} else c[i] = id[p][q];}} printf("%d\n", tot);for(ll i = n + 1; i <= tot; i++) printf("%d %d\n", lc[i], rc[i]);for(ll i = 1; i <= m; i++) printf("%d ", c[i]);return 0;
}

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

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

相关文章

a16z合伙人:语音交互将成为AI应用公司最强大的突破口之一,巨头们在B2C市场已落后太多丨Voice Agent 学习笔记

如果你愿意花些时间调研语音 AI 行业,大概率会碰到 Olivia Moore。她主笔了两次 a16z 关于语音 AI 行业的 分析报告 ,投资的语音项目如 ElevenLabs、Sesame 等都是行业明星。这次播客访谈中,她和 a16z 另外一位合伙人 Anish Acharya 分享了他们对语音 AI 市场的最新观察和分…

20244226 实验二《Python程序设计》实验报告

20244226 2024-2025-2 《Python程序设计》实验2报告 课程:《Python程序设计》 班级: 2442 姓名: 张毓格 学号:20244226 实验教师:王志强 实验日期:2025年4月1日 必修/选修: 公选课 1.实验内容 (1)设计并完成一个完整的应用程序,完成加减乘除模等运算,功能多多益善;…

20244111 实验二《Python程序设计》实验报告

学号 2024-2025-2 《Python程序设计》实验二报告 课程:《Python程序设计》 班级: 2441 姓名: 韩金婕 学号:20244111 实验教师:王志强 实验日期:2025年4月1日 必修/选修: 公选课 1.实验内容 设计并完成一个完整的应用程序,完成加减乘除模阶乘等运算,功能多多益善。通过…

20244112 实验二《Python程序设计》实验报告

20244112 2024-2025-2 《Python程序设计》实验二报告 课程:《Python程序设计》 班级: 2441 姓名: 李其鲔 学号:20244112 实验教师:王志强 实验日期:2025年4月1日 必修/选修: 公选课 1.实验内容 (1)设计并完成一个完整的应用程序,完成加减乘除模等运算,功能多多益善;…

20244102 2024-2025-2 《Python程序设计》实验二报告

20244102 2024-2025-2 《Python程序设计》实验二报告 课程:《Python程序设计》 班级: 2441 姓名: 丁可 学号:20244102 实验教师:王志强 实验日期:2025年4月1日 必修/选修: 公选课 一、实验内容 1.设计并完成一个完整的应用程序,完成加减乘除模等运算,功能多多益善。二…

20242207 实验二 《Python程序设计》实验报告

20242207 2024-2025-2 《Python程序设计》实验二报告 课程:《Python程序设计》 班级: 2422 姓名: 赵泓睿 学号: 20242207 实验教师:王志强 实验日期:2025年3月26日 必修/选修: 公选课 1.实验内容 1.设计并完成一个完整的应用程序,完成加减乘除模等运算,功能多多益善。…

高一下四月日记

云海翻涌,尘世如歌;人间烟火常驻,心中超然长留。低眉俯瞰凡世间,存梦幻歌凭云处。4.1 闲话 做题纪要 luogu P1175 表达式的转换开两个栈辅助建后缀表达式。点击查看代码 char s[110]; deque<char>s1,s2; deque<int>s3; int val(char x) {if(x==() return 0;if(…

进阶图论

进阶图论 I. 割点与桥 首先,我们得了解割点的含义 割点对于一个无向图,如果把一个点删除后这个图的极大连通分量数增加了,那么这个点就是这个图的割点(又称割顶)。通俗点说,就是连接两个或多个连通分量的公共点。 如何求割点呢,这里引用一个算法:Ttarjan 定义 dfn[i] 为…

URAT协议自学笔记

定义 URAT(Universal Asynchronous Receiver/Transmitter)协议是一种通用异步收发传输协议,用于在两个设备之间进行串行数据通信。它将并行数据转换为串行数据进行传输,接收时再将串行数据转换为并行数据。 特点 异步通信:不需要共享时钟信号,通过波特率同步数据传输。 全…

解决手机每次复制都弹出google的nearby服务-分享到附近的设备

起因: 我的手机刷了国际版的系统,有google套件,每次复制都会唤起nearby附近分享这个组件,感觉很烦。 解决方法: 下载AppOps,这个软件能方便我们管理和监视应用权限。 使用Shizuku授权点击左上角,选择使用情况历史点击剪切板我们切出去, 在别的应用中进行一次复制,就可…

neo4j community教程

neo4j community最新版本安装教程(2025.1) 前言 ​ neo4j desktop以交互性好,体验好为优点。但是自24年中旬neo4j官网先后被墙和neo4j desktop联网打不开等诸多问题,本文作者建议使用community版本。 正文下载安装包neo4j官网,下载community最新版本(5.26.1)jdk-23下载(这…

代码随想录第四天 | Leecode 24. 两两交换链表、19.删除链表的倒数第N个节点、 面试题 02.07. 链表相交 、142.环形链表II

Leecode 24. 两两交换链表 题目链接:https://leetcode.cn/problems/swap-nodes-in-pairs/description/ 题目描述:思路:虚拟头节点,注意保存临时节点 题目解答: 循环结束的时候就是,当链表偶数个时cur->next->next=NULL,奇数个时cur->next=NULL。 Leecode 19. 删…